Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Side by Side Diff: recipe_engine/recipe_api.py

Issue 2985323002: Add support for LUCI_CONTEXT.
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | recipe_engine/step_runner.py » ('j') | recipe_engine/step_runner.py » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 absolute_import 5 from __future__ import absolute_import
6 import bisect 6 import bisect
7 import collections 7 import collections
8 import contextlib 8 import contextlib
9 import copy 9 import copy
10 import json 10 import json
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 return copy.deepcopy(self._engine.properties) 168 return copy.deepcopy(self._engine.properties)
169 169
170 170
171 class StepClient(object): 171 class StepClient(object):
172 """A recipe engine client representing step running and introspection.""" 172 """A recipe engine client representing step running and introspection."""
173 173
174 IDENT = 'step' 174 IDENT = 'step'
175 175
176 176
177 class StepConfig(collections.namedtuple('_StepConfig', ( 177 class StepConfig(collections.namedtuple('_StepConfig', (
178 'name', 'base_name', 'cmd', 'cwd', 'env', 'env_prefixes', 178 'name', 'base_name', 'cmd', 'cwd', 'env', 'env_prefixes', 'luci_context',
179 'allow_subannotations', 'trigger_specs', 'timeout', 'infra_step', 179 'allow_subannotations', 'trigger_specs', 'timeout', 'infra_step',
180 'stdout', 'stderr', 'stdin', 'ok_ret', 'step_test_data', 'nest_level'))): 180 'stdout', 'stderr', 'stdin', 'ok_ret', 'step_test_data', 'nest_level'))):
181 181
182 """ 182 """
183 StepConfig is the representation of a raw step as the recipe_engine sees it. 183 StepConfig is the representation of a raw step as the recipe_engine sees it.
184 You should use the standard 'step' recipe module, which will construct and 184 You should use the standard 'step' recipe module, which will construct and
185 pass this data to the engine for you, instead. The only reason why you would 185 pass this data to the engine for you, instead. The only reason why you would
186 need to worry about this object is if you're modifying the step module 186 need to worry about this object is if you're modifying the step module
187 itself. 187 itself.
188 188
189 Fields: 189 Fields:
190 name (str): name of the step, will appear in buildbots waterfall 190 name (str): name of the step, will appear in buildbots waterfall
191 base_name (str): the base name of the step. If the step has a derived 191 base_name (str): the base name of the step. If the step has a derived
192 name (e.g., nested may be concatenated with its parent), this is the 192 name (e.g., nested may be concatenated with its parent), this is the
193 name component of just this step. If None, this will be set to "name". 193 name component of just this step. If None, this will be set to "name".
194 cmd: command to run. Acceptable types: str, Path, Placeholder, or None. 194 cmd: command to run. Acceptable types: str, Path, Placeholder, or None.
195 cwd (str or None): absolute path to working directory for the command 195 cwd (str or None): absolute path to working directory for the command
196 env (dict): overrides for environment variables, described above. 196 env (dict): overrides for environment variables, described above.
197 env_prefixes (dict): environment prefix variables, mapping environment 197 env_prefixes (dict): environment prefix variables, mapping environment
198 variable names to EnvPrefix values. 198 variable names to EnvPrefix values.
199 luci_context (dict): overrides for the LUCI_CONTEXT dict.
199 allow_subannotations (bool): if True, lets the step emit its own 200 allow_subannotations (bool): if True, lets the step emit its own
200 annotations. NOTE: Enabling this can cause some buggy behavior. Please 201 annotations. NOTE: Enabling this can cause some buggy behavior. Please
201 strongly consider using step_result.presentation instead. If you have 202 strongly consider using step_result.presentation instead. If you have
202 questions, please contact infra-dev@chromium.org. 203 questions, please contact infra-dev@chromium.org.
203 trigger_specs: a list of trigger specifications, see also _trigger_builds. 204 trigger_specs: a list of trigger specifications, see also _trigger_builds.
204 timeout: if not None, a datetime.timedelta for the step timeout. 205 timeout: if not None, a datetime.timedelta for the step timeout.
205 infra_step: if True, this is an infrastructure step. Failures will raise 206 infra_step: if True, this is an infrastructure step. Failures will raise
206 InfraFailure instead of StepFailure. 207 InfraFailure instead of StepFailure.
207 stdout: Placeholder to put step stdout into. If used, stdout won't appear 208 stdout: Placeholder to put step stdout into. If used, stdout won't appear
208 in annotator's stdout (and |allow_subannotations| is ignored). 209 in annotator's stdout (and |allow_subannotations| is ignored).
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 for k, v in self.prefixes.iteritems()} 260 for k, v in self.prefixes.iteritems()}
260 return pprint.pformat(rendered, width=1024) 261 return pprint.pformat(rendered, width=1024)
261 262
262 263
263 _RENDER_WHITELIST=frozenset(( 264 _RENDER_WHITELIST=frozenset((
264 'cmd', 265 'cmd',
265 )) 266 ))
266 267
267 _RENDER_BLACKLIST=frozenset(( 268 _RENDER_BLACKLIST=frozenset((
268 'base_name', 269 'base_name',
270 'luci_context', # it's ambient and used only for advanced stuff
iannucci 2017/08/04 18:55:50 This blacklist is used for excluding the entry fro
269 'nest_level', 271 'nest_level',
270 'ok_ret', 272 'ok_ret',
271 'step_test_data', 273 'step_test_data',
272 )) 274 ))
273 275
274 def __new__(cls, **kwargs): 276 def __new__(cls, **kwargs):
275 for field in cls._fields: 277 for field in cls._fields:
276 kwargs.setdefault(field, None) 278 kwargs.setdefault(field, None)
277 sc = super(StepClient.StepConfig, cls).__new__(cls, **kwargs) 279 sc = super(StepClient.StepConfig, cls).__new__(cls, **kwargs)
278 280
279 return sc._replace( 281 return sc._replace(
280 cmd=[(x if isinstance(x, Placeholder) else str(x)) 282 cmd=[(x if isinstance(x, Placeholder) else str(x))
281 for x in (sc.cmd or ())], 283 for x in (sc.cmd or ())],
282 cwd=(str(sc.cwd) if sc.cwd else (None)), 284 cwd=(str(sc.cwd) if sc.cwd else (None)),
283 env=sc.env or {}, 285 env=sc.env or {},
284 env_prefixes=sc.env_prefixes or cls.EnvPrefix.empty(), 286 env_prefixes=sc.env_prefixes or cls.EnvPrefix.empty(),
287 luci_context=sc.luci_context or {},
285 base_name=sc.base_name or sc.name, 288 base_name=sc.base_name or sc.name,
286 allow_subannotations=bool(sc.allow_subannotations), 289 allow_subannotations=bool(sc.allow_subannotations),
287 trigger_specs=sc.trigger_specs or (), 290 trigger_specs=sc.trigger_specs or (),
288 infra_step=bool(sc.infra_step), 291 infra_step=bool(sc.infra_step),
289 ok_ret=frozenset(sc.ok_ret or (0,)), 292 ok_ret=frozenset(sc.ok_ret or (0,)),
290 nest_level=int(sc.nest_level or 0), 293 nest_level=int(sc.nest_level or 0),
291 ) 294 )
292 295
293 def render_to_dict(self): 296 def render_to_dict(self):
294 sc = self._replace( 297 sc = self._replace(
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 def bind(self, name, property_type, full_decl_name): 1097 def bind(self, name, property_type, full_decl_name):
1095 """ 1098 """
1096 Gets the BoundProperty version of this Property. Requires a name. 1099 Gets the BoundProperty version of this Property. Requires a name.
1097 """ 1100 """
1098 return BoundProperty( 1101 return BoundProperty(
1099 self._default, self.help, self.kind, name, property_type, full_decl_name, 1102 self._default, self.help, self.kind, name, property_type, full_decl_name,
1100 self.param_name) 1103 self.param_name)
1101 1104
1102 class UndefinedPropertyException(TypeError): 1105 class UndefinedPropertyException(TypeError):
1103 pass 1106 pass
OLDNEW
« no previous file with comments | « no previous file | recipe_engine/step_runner.py » ('j') | recipe_engine/step_runner.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698