OLD | NEW |
1 # Copyright 2016 The LUCI Authors. All rights reserved. | 1 # Copyright 2016 The LUCI Authors. All rights reserved. |
2 # Use of this source code is governed under the Apache License, Version 2.0 | 2 # Use of this source code is governed under the Apache License, Version 2.0 |
3 # that can be found in the LICENSE file. | 3 # that can be found in the LICENSE file. |
4 | 4 |
5 from __future__ import print_function | 5 from __future__ import print_function |
6 | 6 |
7 import json | 7 import json |
8 import os | 8 import os |
9 import subprocess | 9 import subprocess |
10 import sys | 10 import sys |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 """ | 124 """ |
125 # Use _local_ recipes.py, so that it checks out the pinned recipe engine, | 125 # Use _local_ recipes.py, so that it checks out the pinned recipe engine, |
126 # rather than running recipe engine which may be at a different revision | 126 # rather than running recipe engine which may be at a different revision |
127 # than the pinned one. | 127 # than the pinned one. |
128 args = [ | 128 args = [ |
129 sys.executable, | 129 sys.executable, |
130 os.path.join(repo_root, package_spec.recipes_path, 'recipes.py'), | 130 os.path.join(repo_root, package_spec.recipes_path, 'recipes.py'), |
131 ] | 131 ] |
132 if not allow_fetch: | 132 if not allow_fetch: |
133 args.append('--no-fetch') | 133 args.append('--no-fetch') |
134 args.extend(['test', 'run']) | 134 args.append('test') |
135 if additional_args: | 135 if additional_args: |
136 args.extend(additional_args) | 136 args.extend(additional_args) |
137 p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) | 137 p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
138 output, _ = p.communicate() | 138 output, _ = p.communicate() |
139 rc = p.returncode | 139 rc = p.returncode |
140 return rc, output | 140 return rc, output |
141 | 141 |
142 | 142 |
143 def process_candidates(candidates, context, config_file, package_spec): | 143 def process_candidates(candidates, context, config_file, package_spec): |
144 roll_details = [] | 144 roll_details = [] |
(...skipping 17 matching lines...) Expand all Loading... |
162 # the maximal one, e.g. to jump over some reverts, or include fixes | 162 # the maximal one, e.g. to jump over some reverts, or include fixes |
163 # landed later for incompatible API changes. | 163 # landed later for incompatible API changes. |
164 for i, candidate in enumerate(candidates): | 164 for i, candidate in enumerate(candidates): |
165 print(' processing candidate #%d... ' % (i + 1), end='') | 165 print(' processing candidate #%d... ' % (i + 1), end='') |
166 | 166 |
167 spec = candidate.get_rolled_spec() | 167 spec = candidate.get_rolled_spec() |
168 config_file.write(spec.dump()) | 168 config_file.write(spec.dump()) |
169 fetch(context.repo_root, package_spec) | 169 fetch(context.repo_root, package_spec) |
170 write_new_recipes_py(context, spec, repo_cfg_block) | 170 write_new_recipes_py(context, spec, repo_cfg_block) |
171 | 171 |
172 rc, output = run_simulation_test(context.repo_root, package_spec) | 172 rc, output = run_simulation_test(context.repo_root, package_spec, ['run']) |
173 roll_details[i]['recipes_simulation_test'] = { | 173 roll_details[i]['recipes_simulation_test'] = { |
174 'output': output, | 174 'output': output, |
175 'rc': rc, | 175 'rc': rc, |
176 } | 176 } |
177 | 177 |
178 if rc == 0: | 178 if rc == 0: |
179 print('SUCCESS!') | 179 print('SUCCESS!') |
180 trivial = True | 180 trivial = True |
181 picked_roll_details = roll_details[i] | 181 picked_roll_details = roll_details[i] |
182 break | 182 break |
183 else: | 183 else: |
184 print('FAILED') | 184 print('FAILED') |
185 | 185 |
186 if not picked_roll_details: | 186 if not picked_roll_details: |
187 print('looking for a nontrivial roll...') | 187 print('looking for a nontrivial roll...') |
188 | 188 |
189 # Process candidates smallest first. If the roll is going to change | 189 # Process candidates smallest first. If the roll is going to change |
190 # expectations, it should be minimal to avoid pulling too many unrelated | 190 # expectations, it should be minimal to avoid pulling too many unrelated |
191 # changes. | 191 # changes. |
192 for i, candidate in reversed(list(enumerate(candidates))): | 192 for i, candidate in reversed(list(enumerate(candidates))): |
193 print(' processing candidate #%d... ' % (i + 1), end='') | 193 print(' processing candidate #%d... ' % (i + 1), end='') |
194 | 194 |
195 spec = candidate.get_rolled_spec() | 195 spec = candidate.get_rolled_spec() |
196 config_file.write(spec.dump()) | 196 config_file.write(spec.dump()) |
197 fetch(context.repo_root, package_spec) | 197 fetch(context.repo_root, package_spec) |
198 write_new_recipes_py(context, spec, repo_cfg_block) | 198 write_new_recipes_py(context, spec, repo_cfg_block) |
199 | 199 |
200 rc, output = run_simulation_test( | 200 rc, output = run_simulation_test( |
201 context.repo_root, package_spec, ['--train']) | 201 context.repo_root, package_spec, ['train']) |
202 roll_details[i]['recipes_simulation_test_train'] = { | 202 roll_details[i]['recipes_simulation_test_train'] = { |
203 'output': output, | 203 'output': output, |
204 'rc': rc, | 204 'rc': rc, |
205 } | 205 } |
206 | 206 |
207 if rc == 0: | 207 if rc == 0: |
208 print('SUCCESS!') | 208 print('SUCCESS!') |
209 trivial = False | 209 trivial = False |
210 picked_roll_details = roll_details[i] | 210 picked_roll_details = roll_details[i] |
211 break | 211 break |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 | 261 |
262 results = {} | 262 results = {} |
263 try: | 263 try: |
264 results = test_rolls( | 264 results = test_rolls( |
265 config_file, context, package_spec, args.projects or []) | 265 config_file, context, package_spec, args.projects or []) |
266 finally: | 266 finally: |
267 if not results.get('success'): | 267 if not results.get('success'): |
268 # Restore initial state. Since we could be running simulation tests | 268 # Restore initial state. Since we could be running simulation tests |
269 # on other revisions, re-run them now as well. | 269 # on other revisions, re-run them now as well. |
270 config_file.write(package_spec.dump()) | 270 config_file.write(package_spec.dump()) |
271 run_simulation_test(context.repo_root, package_spec, ['--train'], | 271 run_simulation_test(context.repo_root, package_spec, ['train'], |
272 allow_fetch=True) | 272 allow_fetch=True) |
273 | 273 |
274 if args.output_json: | 274 if args.output_json: |
275 with open(args.output_json, 'w') as f: | 275 with open(args.output_json, 'w') as f: |
276 json.dump( | 276 json.dump( |
277 results, f, default=default_json_encode, sort_keys=True, indent=4) | 277 results, f, default=default_json_encode, sort_keys=True, indent=4) |
278 | 278 |
279 return 0 | 279 return 0 |
OLD | NEW |