| 363 | Can either be a leaf or an inner node that provides default values. |
| 364 | """ |
| 365 | def __init__(self, suite, parent, arch): |
| 366 | super(GraphConfig, self).__init__() |
| 367 | self._suite = suite |
| 368 | |
| 369 | assert isinstance(suite.get('path', []), list) |
| 370 | assert isinstance(suite.get('owners', []), list) |
| 371 | assert isinstance(suite['name'], str) |
| 372 | assert isinstance(suite.get('flags', []), list) |
| 373 | assert isinstance(suite.get('test_flags', []), list) |
| 374 | assert isinstance(suite.get('resources', []), list) |
| 375 | |
| 376 | # Only used by child classes |
| 377 | self.main = suite.get('main', parent.main) |
| 378 | # Keep parent for easier debugging |
| 379 | self.parent = parent |
| 380 | |
| 381 | # Accumulated values. |
| 382 | self.path = parent.path[:] + suite.get('path', []) |
| 383 | self.graphs = parent.graphs[:] + [suite['name']] |
| 384 | self.flags = parent.flags[:] + suite.get('flags', []) |
| 385 | self.test_flags = parent.test_flags[:] + suite.get('test_flags', []) |
| 386 | self.owners = parent.owners[:] + suite.get('owners', []) |
| 387 | |
| 388 | # Values independent of parent node. |
| 389 | self.resources = suite.get('resources', []) |
| 390 | |
| 391 | # Descrete values (with parent defaults). |
| 392 | self.binary = suite.get('binary', parent.binary) |
| 393 | self.run_count = suite.get('run_count', parent.run_count) |
| 394 | self.run_count = suite.get('run_count_%s' % arch, self.run_count) |
| 395 | self.retry_count = suite.get('retry_count', parent.retry_count) |
| 396 | self.retry_count = suite.get('retry_count_%s' % arch, self.retry_count) |
| 397 | self.timeout = suite.get('timeout', parent.timeout) |
| 398 | self.timeout = suite.get('timeout_%s' % arch, self.timeout) |
| 399 | self.units = suite.get('units', parent.units) |
| 400 | self.total = suite.get('total', parent.total) |
| 401 | self.results_processor = suite.get( |
| 402 | 'results_processor', parent.results_processor) |
| 403 | self.process_size = suite.get('process_size', parent.process_size) |
| 404 | |
| 405 | # A regular expression for results. If the parent graph provides a |
| 406 | # regexp and the current suite has none, a string place holder for the |
| 407 | # suite name is expected. |
| 408 | # TODO(machenbach): Currently that makes only sense for the leaf level. |
| 409 | # Multiple place holders for multiple levels are not supported. |
| 410 | self.results_regexp = suite.get('results_regexp', None) |
| 411 | if self.results_regexp is None and parent.results_regexp: |
| 412 | try: |
| 413 | self.results_regexp = parent.results_regexp % re.escape(suite['name']) |
| 414 | except TypeError as e: |
| 415 | raise TypeError( |
| 416 | "Got error while preparing results_regexp: " |
| 417 | "parent.results_regexp='%s' suite.name='%s' suite='%s', error: %s" % |
| 418 | (parent.results_regexp, suite['name'], str(suite)[:100], e)) |
| 419 | |
| 420 | self.results_default = suite.get('results_default', None) |
| 421 | |
| 422 | # A similar regular expression for the standard deviation (optional). |