Merge lp:~le-chi-thu/lava-test/merging_w1121 into lp:lava-test/0.0
- merging_w1121
- Merge into trunk
Status: | Merged |
---|---|
Merged at revision: | 70 |
Proposed branch: | lp:~le-chi-thu/lava-test/merging_w1121 |
Merge into: | lp:lava-test/0.0 |
Diff against target: |
377 lines (+175/-49) 6 files modified
abrek/api.py (+44/-0) abrek/bundle.py (+44/-0) abrek/dashboard.py (+20/-13) abrek/main.py (+6/-0) abrek/testdef.py (+30/-27) tests/test_dashboard.py (+31/-9) |
To merge this branch: | bzr merge lp:~le-chi-thu/lava-test/merging_w1121 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Paul Larson (community) | Approve | ||
Review via email:
|
Commit message
Description of the change
Merged the following branches:
https:/
https:/
https:/
https:/
https:/
- 73. By Le Chi Thu <email address hidden> <email address hidden>
-
Undo the UUID changes
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Le Chi Thu (le-chi-thu) wrote : | # |
Hi
I did not merge the
https:/
and I
found the uuid is included in
https:/
Now I manually removed the uuid changes in 58356 and push the changes to
this mp.
BR
/Chi Thu
On 7 June 2011 18:39, Paul Larson <email address hidden> wrote:
> Review: Needs Fixing
> This seems to work, but somehow you seem to have picked up the changes from
> https:/
>
> It also might have been easier to spot this if you had done a commit for
> each merge. You only have 3 commits here, but there were several branches
> going into this.
> --
> https:/
> You are the owner of lp:~le-chi-thu/abrek/merging_w1121.
>
Preview Diff
1 | === added file 'abrek/api.py' | |||
2 | --- abrek/api.py 1970-01-01 00:00:00 +0000 | |||
3 | +++ abrek/api.py 2011-06-07 21:21:22 +0000 | |||
4 | @@ -0,0 +1,44 @@ | |||
5 | 1 | """ | ||
6 | 2 | Public API for extending Abrek | ||
7 | 3 | """ | ||
8 | 4 | from abc import abstractmethod, abstractproperty | ||
9 | 5 | |||
10 | 6 | |||
11 | 7 | class ITest(object): | ||
12 | 8 | """ | ||
13 | 9 | Abrek test. | ||
14 | 10 | |||
15 | 11 | Something that can be installed and invoked by abre. | ||
16 | 12 | """ | ||
17 | 13 | |||
18 | 14 | @abstractmethod | ||
19 | 15 | def install(self): | ||
20 | 16 | """ | ||
21 | 17 | Install the test suite. | ||
22 | 18 | |||
23 | 19 | This creates an install directory under the user's XDG_DATA_HOME | ||
24 | 20 | directory to mark that the test is installed. The installer's | ||
25 | 21 | install() method is then called from this directory to complete any | ||
26 | 22 | test specific install that may be needed. | ||
27 | 23 | """ | ||
28 | 24 | |||
29 | 25 | @abstractmethod | ||
30 | 26 | def uninstall(self): | ||
31 | 27 | """ | ||
32 | 28 | Uninstall the test suite. | ||
33 | 29 | |||
34 | 30 | Uninstalling just recursively removes the test specific directory under | ||
35 | 31 | the user's XDG_DATA_HOME directory. This will both mark the test as | ||
36 | 32 | removed, and clean up any files that were downloaded or installed under | ||
37 | 33 | that directory. Dependencies are intentionally not removed by this. | ||
38 | 34 | """ | ||
39 | 35 | |||
40 | 36 | @abstractmethod | ||
41 | 37 | def run(self, quiet=False): | ||
42 | 38 | # TODO: Document me | ||
43 | 39 | pass | ||
44 | 40 | |||
45 | 41 | @abstractmethod | ||
46 | 42 | def parse(self, resultname): | ||
47 | 43 | # TODO: Document me | ||
48 | 44 | pass | ||
49 | 0 | 45 | ||
50 | === added file 'abrek/bundle.py' | |||
51 | --- abrek/bundle.py 1970-01-01 00:00:00 +0000 | |||
52 | +++ abrek/bundle.py 2011-06-07 21:21:22 +0000 | |||
53 | @@ -0,0 +1,44 @@ | |||
54 | 1 | # Copyright (c) 2011 Linaro | ||
55 | 2 | # | ||
56 | 3 | # This program is free software: you can redistribute it and/or modify | ||
57 | 4 | # it under the terms of the GNU General Public License as published by | ||
58 | 5 | # the Free Software Foundation, either version 3 of the License, or | ||
59 | 6 | # (at your option) any later version. | ||
60 | 7 | # | ||
61 | 8 | # This program is distributed in the hope that it will be useful, | ||
62 | 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
63 | 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
64 | 11 | # GNU General Public License for more details. | ||
65 | 12 | # | ||
66 | 13 | # You should have received a copy of the GNU General Public License | ||
67 | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
68 | 15 | |||
69 | 16 | """ | ||
70 | 17 | This module attempts to use the linaro-dashboard-bundle package, if possible. | ||
71 | 18 | |||
72 | 19 | Using that package adds proper support for loading and saving bundle | ||
73 | 20 | documents. In particular it supports loosles decimals, better, more stable | ||
74 | 21 | load-modify-write cycles, data validation, transparent migration and many | ||
75 | 22 | other features. | ||
76 | 23 | |||
77 | 24 | It is not a hard dependency to make it possible to run abrek from a checkout | ||
78 | 25 | without having to install (too many) dependencies. | ||
79 | 26 | """ | ||
80 | 27 | |||
81 | 28 | try: | ||
82 | 29 | from linaro_dashboard_bundle import DocumentIO | ||
83 | 30 | except ImportError: | ||
84 | 31 | import json | ||
85 | 32 | |||
86 | 33 | class DocumentIO(object): | ||
87 | 34 | """ Bare replacement DocumentIO without any fancy features """ | ||
88 | 35 | |||
89 | 36 | @classmethod | ||
90 | 37 | def dumps(cls, doc): | ||
91 | 38 | return json.dumps(doc, indent=2) | ||
92 | 39 | |||
93 | 40 | @classmethod | ||
94 | 41 | def loads(cls, text): | ||
95 | 42 | doc = json.loads(text) | ||
96 | 43 | fmt = doc.get("format") | ||
97 | 44 | return fmt, doc | ||
98 | 0 | \ No newline at end of file | 45 | \ No newline at end of file |
99 | 1 | 46 | ||
100 | === modified file 'abrek/dashboard.py' | |||
101 | --- abrek/dashboard.py 2010-10-14 13:57:35 +0000 | |||
102 | +++ abrek/dashboard.py 2011-06-07 21:21:22 +0000 | |||
103 | @@ -14,7 +14,6 @@ | |||
104 | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
105 | 15 | 15 | ||
106 | 16 | import base64 | 16 | import base64 |
107 | 17 | import json | ||
108 | 18 | import os | 17 | import os |
109 | 19 | import socket | 18 | import socket |
110 | 20 | import sys | 19 | import sys |
111 | @@ -24,6 +23,7 @@ | |||
112 | 24 | from getpass import getpass | 23 | from getpass import getpass |
113 | 25 | from optparse import make_option | 24 | from optparse import make_option |
114 | 26 | 25 | ||
115 | 26 | from abrek.bundle import DocumentIO | ||
116 | 27 | from abrek.command import AbrekCmd, AbrekCmdWithSubcommands | 27 | from abrek.command import AbrekCmd, AbrekCmdWithSubcommands |
117 | 28 | from abrek.config import get_config | 28 | from abrek.config import get_config |
118 | 29 | from abrek.testdef import testloader | 29 | from abrek.testdef import testloader |
119 | @@ -147,7 +147,7 @@ | |||
120 | 147 | "dashboard setup [host]'" | 147 | "dashboard setup [host]'" |
121 | 148 | sys.exit(1) | 148 | sys.exit(1) |
122 | 149 | try: | 149 | try: |
124 | 150 | result = server.put(json.dumps(bundle, indent=2), result_name, | 150 | result = server.put(DocumentIO.dumps(bundle), result_name, |
125 | 151 | stream_name) | 151 | stream_name) |
126 | 152 | print "Bundle successfully uploaded to id: %s" % result | 152 | print "Bundle successfully uploaded to id: %s" % result |
127 | 153 | except xmlrpclib.Fault as strerror: | 153 | except xmlrpclib.Fault as strerror: |
128 | @@ -173,7 +173,7 @@ | |||
129 | 173 | sys.exit(1) | 173 | sys.exit(1) |
130 | 174 | bundle = generate_bundle(self.args[0]) | 174 | bundle = generate_bundle(self.args[0]) |
131 | 175 | try: | 175 | try: |
133 | 176 | print json.dumps(bundle, indent=2) | 176 | print DocumentIO.dumps(bundle) |
134 | 177 | except IOError: | 177 | except IOError: |
135 | 178 | pass | 178 | pass |
136 | 179 | 179 | ||
137 | @@ -182,17 +182,24 @@ | |||
138 | 182 | config = get_config() | 182 | config = get_config() |
139 | 183 | resultdir = os.path.join(config.resultsdir, result) | 183 | resultdir = os.path.join(config.resultsdir, result) |
140 | 184 | if not os.path.exists(resultdir): | 184 | if not os.path.exists(resultdir): |
141 | 185 | # FIXME: UI and sys.exit mixed with internal implementation, yuck | ||
142 | 185 | print "Result directory not found" | 186 | print "Result directory not found" |
143 | 186 | sys.exit(1) | 187 | sys.exit(1) |
154 | 187 | testdatafile = os.path.join(resultdir, "testdata.json") | 188 | with open(os.path.join(resultdir, "testdata.json")) as stream: |
155 | 188 | testdata = json.loads(file(testdatafile).read()) | 189 | bundle_text = stream.read() |
156 | 189 | test = testloader(testdata['test_runs'][0]['test_id']) | 190 | with open(os.path.join(resultdir, "testoutput.log")) as stream: |
157 | 190 | try: | 191 | output_text = stream.read() |
158 | 191 | test.parse(result) | 192 | fmt, bundle = DocumentIO.loads(bundle_text) |
159 | 192 | except Exception as strerror: | 193 | test = testloader(bundle['test_runs'][0]['test_id']) |
160 | 193 | print "Test parse error: %s" % strerror | 194 | test.parse(result) |
161 | 194 | sys.exit(1) | 195 | bundle['test_runs'][0]["test_results"] = test.parser.results["test_results"] |
162 | 195 | testdata['test_runs'][0].update(test.parser.results) | 196 | bundle['test_runs'][0]["attachments"] = [ |
163 | 196 | return testdata | 197 | { |
164 | 198 | "pathname": "testoutput.log", | ||
165 | 199 | "mime_type": "text/plain", | ||
166 | 200 | "content": base64.standard_b64encode(output_text) | ||
167 | 201 | } | ||
168 | 202 | ] | ||
169 | 203 | return bundle | ||
170 | 197 | 204 | ||
171 | 198 | 205 | ||
172 | 199 | 206 | ||
173 | === modified file 'abrek/main.py' | |||
174 | --- abrek/main.py 2010-10-11 23:05:37 +0000 | |||
175 | +++ abrek/main.py 2011-06-07 21:21:22 +0000 | |||
176 | @@ -26,3 +26,9 @@ | |||
177 | 26 | print "command '%s' not found" % cmd | 26 | print "command '%s' not found" % cmd |
178 | 27 | return 1 | 27 | return 1 |
179 | 28 | return cmd_func.main(argv) | 28 | return cmd_func.main(argv) |
180 | 29 | |||
181 | 30 | if __name__ == '__main__': | ||
182 | 31 | import os | ||
183 | 32 | import sys | ||
184 | 33 | exit_code = main(sys.argv) | ||
185 | 34 | sys.exit(exit_code) | ||
186 | 29 | \ No newline at end of file | 35 | \ No newline at end of file |
187 | 30 | 36 | ||
188 | === modified file 'abrek/testdef.py' | |||
189 | --- abrek/testdef.py 2011-04-20 08:39:25 +0000 | |||
190 | +++ abrek/testdef.py 2011-06-07 21:21:22 +0000 | |||
191 | @@ -14,7 +14,6 @@ | |||
192 | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
193 | 15 | 15 | ||
194 | 16 | import hashlib | 16 | import hashlib |
195 | 17 | import json | ||
196 | 18 | import os | 17 | import os |
197 | 19 | import re | 18 | import re |
198 | 20 | import shutil | 19 | import shutil |
199 | @@ -22,15 +21,15 @@ | |||
200 | 22 | import time | 21 | import time |
201 | 23 | from commands import getstatusoutput | 22 | from commands import getstatusoutput |
202 | 24 | from datetime import datetime | 23 | from datetime import datetime |
203 | 25 | from uuid import uuid1 | ||
204 | 26 | 24 | ||
205 | 25 | from abrek import swprofile, hwprofile | ||
206 | 26 | from abrek.api import ITest | ||
207 | 27 | from abrek.bundle import DocumentIO | ||
208 | 27 | from abrek.config import get_config | 28 | from abrek.config import get_config |
209 | 28 | from abrek.utils import Tee, geturl, run_and_log, write_file | 29 | from abrek.utils import Tee, geturl, run_and_log, write_file |
215 | 29 | from abrek import hwprofile | 30 | |
216 | 30 | from abrek import swprofile | 31 | |
217 | 31 | 32 | class AbrekTest(ITest): | |
213 | 32 | |||
214 | 33 | class AbrekTest(object): | ||
218 | 34 | """Base class for defining tests. | 33 | """Base class for defining tests. |
219 | 35 | 34 | ||
220 | 36 | This can be used by test definition files to create an object that | 35 | This can be used by test definition files to create an object that |
221 | @@ -94,21 +93,21 @@ | |||
222 | 94 | 93 | ||
223 | 95 | def _savetestdata(self): | 94 | def _savetestdata(self): |
224 | 96 | TIMEFORMAT = '%Y-%m-%dT%H:%M:%SZ' | 95 | TIMEFORMAT = '%Y-%m-%dT%H:%M:%SZ' |
228 | 97 | testdata = {} | 96 | bundle = { |
229 | 98 | test_runs = [{}] | 97 | 'format': 'Dashboard Bundle Format 1.2', |
230 | 99 | testdata['format'] = "Dashboard Bundle Format 1.2" | 98 | 'test_runs': [ |
231 | 99 | { | ||
232 | 100 | 'test_id': self.testname, | ||
233 | 101 | 'analyzer_assigned_date': self.runner.starttime.strftime(TIMEFORMAT), | ||
234 | 102 | 'time_check_performed': False, | ||
235 | 103 | 'hardware_context': hwprofile.get_hardware_context(), | ||
236 | 104 | 'software_context': swprofile.get_software_context(), | ||
237 | 105 | 'test_results': [] | ||
238 | 106 | } | ||
239 | 107 | ] | ||
240 | 108 | } | ||
241 | 100 | filename = os.path.join(self.resultsdir, 'testdata.json') | 109 | filename = os.path.join(self.resultsdir, 'testdata.json') |
253 | 101 | test_runs[0]['test_id'] = self.testname | 110 | write_file(DocumentIO.dumps(bundle), filename) |
243 | 102 | test_runs[0]['analyzer_assigned_uuid'] = str(uuid1()) | ||
244 | 103 | test_runs[0]['time_check_performed'] = False | ||
245 | 104 | test_runs[0]['analyzer_assigned_date'] = datetime.strftime( | ||
246 | 105 | self.runner.starttime,TIMEFORMAT) | ||
247 | 106 | hw = hwprofile.get_hardware_context() | ||
248 | 107 | test_runs[0]['hardware_context'] = hw | ||
249 | 108 | sw = swprofile.get_software_context() | ||
250 | 109 | test_runs[0]['software_context'] = sw | ||
251 | 110 | testdata['test_runs'] = test_runs | ||
252 | 111 | write_file(json.dumps(testdata, indent=2), filename) | ||
254 | 112 | 111 | ||
255 | 113 | def run(self, quiet=False): | 112 | def run(self, quiet=False): |
256 | 114 | if not self.runner: | 113 | if not self.runner: |
257 | @@ -120,10 +119,12 @@ | |||
258 | 120 | str(time.mktime(datetime.utcnow().timetuple()))) | 119 | str(time.mktime(datetime.utcnow().timetuple()))) |
259 | 121 | self.resultsdir = os.path.join(config.resultsdir, resultname) | 120 | self.resultsdir = os.path.join(config.resultsdir, resultname) |
260 | 122 | os.makedirs(self.resultsdir) | 121 | os.makedirs(self.resultsdir) |
265 | 123 | os.chdir(installdir) | 122 | try: |
266 | 124 | self.runner.run(self.resultsdir, quiet=quiet) | 123 | os.chdir(installdir) |
267 | 125 | self._savetestdata() | 124 | self.runner.run(self.resultsdir, quiet=quiet) |
268 | 126 | os.chdir(self.origdir) | 125 | self._savetestdata() |
269 | 126 | finally: | ||
270 | 127 | os.chdir(self.origdir) | ||
271 | 127 | result_id = os.path.basename(self.resultsdir) | 128 | result_id = os.path.basename(self.resultsdir) |
272 | 128 | print("ABREK TEST RUN COMPLETE: Result id is '%s'" % result_id) | 129 | print("ABREK TEST RUN COMPLETE: Result id is '%s'" % result_id) |
273 | 129 | return result_id | 130 | return result_id |
274 | @@ -278,12 +279,14 @@ | |||
275 | 278 | except Exception as strerror: | 279 | except Exception as strerror: |
276 | 279 | raise RuntimeError("AbrekTestParser - Invalid regular expression '%s' - %s" %(self.pattern,strerror)) | 280 | raise RuntimeError("AbrekTestParser - Invalid regular expression '%s' - %s" %(self.pattern,strerror)) |
277 | 280 | 281 | ||
280 | 281 | with open(filename, 'r') as fd: | 282 | with open(filename, 'r') as stream: |
281 | 282 | for line in fd.readlines(): | 283 | for lineno, line in enumerate(stream, 1): |
282 | 283 | match = pat.search(line) | 284 | match = pat.search(line) |
283 | 284 | if not match: | 285 | if not match: |
284 | 285 | continue | 286 | continue |
285 | 286 | data = match.groupdict() | 287 | data = match.groupdict() |
286 | 288 | data["log_filename"] = filename | ||
287 | 289 | data["log_lineno"] = lineno | ||
288 | 287 | self.results['test_results'].append(data) | 290 | self.results['test_results'].append(data) |
289 | 288 | if self.fixupdict: | 291 | if self.fixupdict: |
290 | 289 | self.fixresults(self.fixupdict) | 292 | self.fixresults(self.fixupdict) |
291 | 290 | 293 | ||
292 | === modified file 'tests/test_dashboard.py' | |||
293 | --- tests/test_dashboard.py 2011-04-07 05:26:43 +0000 | |||
294 | +++ tests/test_dashboard.py 2011-06-07 21:21:22 +0000 | |||
295 | @@ -76,37 +76,54 @@ | |||
296 | 76 | cmd = cmd_dashboard.cmd_bundle() | 76 | cmd = cmd_dashboard.cmd_bundle() |
297 | 77 | (testname, testuuid) = make_stream_result(self.config) | 77 | (testname, testuuid) = make_stream_result(self.config) |
298 | 78 | expected_dict = { | 78 | expected_dict = { |
299 | 79 | "format": "Dashboard Bundle Format 1.2", | ||
300 | 79 | "test_runs": [{ | 80 | "test_runs": [{ |
301 | 80 | "analyzer_assigned_date": "2010-10-10T00:00:00Z", | 81 | "analyzer_assigned_date": "2010-10-10T00:00:00Z", |
302 | 81 | "analyzer_assigned_uuid": testuuid, | 82 | "analyzer_assigned_uuid": testuuid, |
304 | 82 | "hardware_context": {}, | 83 | "hardware_context": { |
305 | 84 | "devices": [] | ||
306 | 85 | }, | ||
307 | 83 | "software_context": {}, | 86 | "software_context": {}, |
308 | 84 | "test_id": "stream", | 87 | "test_id": "stream", |
309 | 85 | "test_results": [{ | 88 | "test_results": [{ |
310 | 86 | "measurement": 1111.1111, | 89 | "measurement": 1111.1111, |
311 | 87 | "result": "pass", | 90 | "result": "pass", |
312 | 88 | "test_case_id": "Copy", | 91 | "test_case_id": "Copy", |
314 | 89 | "units": "MB/s" | 92 | "units": "MB/s", |
315 | 93 | "log_filename": "testoutput.log", | ||
316 | 94 | "log_lineno": 3 | ||
317 | 90 | }, | 95 | }, |
318 | 91 | { | 96 | { |
319 | 92 | "measurement": 2222.2222, | 97 | "measurement": 2222.2222, |
320 | 93 | "result": "pass", | 98 | "result": "pass", |
321 | 94 | "test_case_id": "Scale", | 99 | "test_case_id": "Scale", |
323 | 95 | "units": "MB/s" | 100 | "units": "MB/s", |
324 | 101 | "log_filename": "testoutput.log", | ||
325 | 102 | "log_lineno": 4 | ||
326 | 96 | }, | 103 | }, |
327 | 97 | { | 104 | { |
328 | 98 | "measurement": 3333.3333, | 105 | "measurement": 3333.3333, |
329 | 99 | "result": "pass", | 106 | "result": "pass", |
330 | 100 | "test_case_id": "Add", | 107 | "test_case_id": "Add", |
332 | 101 | "units": "MB/s" | 108 | "units": "MB/s", |
333 | 109 | "log_filename": "testoutput.log", | ||
334 | 110 | "log_lineno": 5 | ||
335 | 102 | }, | 111 | }, |
336 | 103 | { | 112 | { |
337 | 104 | "measurement": 4444.4444, | 113 | "measurement": 4444.4444, |
338 | 105 | "result": "pass", | 114 | "result": "pass", |
339 | 106 | "test_case_id": "Triad", | 115 | "test_case_id": "Triad", |
341 | 107 | "units": "MB/s" | 116 | "units": "MB/s", |
342 | 117 | "log_filename": "testoutput.log", | ||
343 | 118 | "log_lineno": 6 | ||
344 | 108 | }], | 119 | }], |
346 | 109 | "time_check_performed": False | 120 | "time_check_performed": False, |
347 | 121 | "attachments": [ | ||
348 | 122 | { | ||
349 | 123 | "mime_type": "text/plain", | ||
350 | 124 | "pathname": "testoutput.log", | ||
351 | 125 | "content": "CkZ1bmN0aW9uICAgICAgUmF0ZSAoTUIvcykgICBBdmcgdGltZSAgICAgTWluIHRpbWUgICAgIE1heCB0aW1lCkNvcHk6ICAgICAgICAxMTExLjExMTEgICAgICAgMC4wMTgwICAgICAgIDAuMDExMiAgICAgICAwLjAyNDIKU2NhbGU6ICAgICAgIDIyMjIuMjIyMiAgICAgICAwLjAxOTggICAgICAgMC4wMTIyICAgICAgIDAuMDI0MwpBZGQ6ICAgICAgICAgMzMzMy4zMzMzICAgICAgIDAuMDIwMSAgICAgICAwLjAxNzYgICAgICAgMC4wMjIzClRyaWFkOiAgICAgICA0NDQ0LjQ0NDQgICAgICAgMC4wMTk3ICAgICAgIDAuMDEzOCAgICAgICAwLjAyMjMK" | ||
352 | 126 | }] | ||
353 | 110 | }] | 127 | }] |
354 | 111 | } | 128 | } |
355 | 112 | cmd.main(argv=[testname]) | 129 | cmd.main(argv=[testname]) |
356 | @@ -159,13 +176,18 @@ | |||
357 | 159 | testname = "stream000" | 176 | testname = "stream000" |
358 | 160 | testuuid = str(uuid1()) | 177 | testuuid = str(uuid1()) |
359 | 161 | testdata_data = """ | 178 | testdata_data = """ |
361 | 162 | {"test_runs": [{ | 179 | { |
362 | 180 | "format": "Dashboard Bundle Format 1.2", | ||
363 | 181 | "test_runs": [{ | ||
364 | 163 | "analyzer_assigned_date": "2010-10-10T00:00:00Z", | 182 | "analyzer_assigned_date": "2010-10-10T00:00:00Z", |
365 | 164 | "analyzer_assigned_uuid": "%s", | 183 | "analyzer_assigned_uuid": "%s", |
367 | 165 | "hardware_context": {}, | 184 | "hardware_context": { |
368 | 185 | "devices": [] | ||
369 | 186 | }, | ||
370 | 166 | "software_context": {}, | 187 | "software_context": {}, |
371 | 167 | "test_id": "stream", | 188 | "test_id": "stream", |
373 | 168 | "time_check_performed": false | 189 | "time_check_performed": false, |
374 | 190 | "test_results": [] | ||
375 | 169 | }] | 191 | }] |
376 | 170 | } | 192 | } |
377 | 171 | """ % testuuid | 193 | """ % testuuid |
This seems to work, but somehow you seem to have picked up the changes from https:/ /code.launchpad .net/~zkrynicki /abrek/ save-tests- as-uuid/ +merge/ 58356 which I asked that we *not* pick up for now.
It also might have been easier to spot this if you had done a commit for each merge. You only have 3 commits here, but there were several branches going into this.