Bug 1414919 - [taskgraph] Create a 'rebuild' morph template, r=dustin

This template takes a single integer as input, and sets the 'task_duplicates'
attribute on any tasks that were explicitly specified by try_task_config.json.
This means dependent tasks or 'always_target' tasks will not be rebuilt.

To support this template, the apply_jsone_templates morph now requires the
entire try_task_config object instead of just the templates.

MozReview-Commit-ID: DwxUtlC5VD5

--HG--
extra : rebase_source : c57a80ada2fc4591a5ce4c94965b8c9f02bb53b1
This commit is contained in:
Andrew Halberstadt 2017-11-07 10:22:35 -05:00
Родитель 1ec6a60b5b
Коммит 1fdddacae3
4 изменённых файлов: 57 добавлений и 6 удалений

Просмотреть файл

@ -114,6 +114,8 @@ The context available to the JSON-e render contains attributes from the
{
"attributes": task.attributes,
"kind": task.kind,
"label": task.label,
"target_tasks": [<tasks from try_task_config.json>],
"task": task.task,
"taskId": task.task_id,
"input": ...

Просмотреть файл

@ -253,8 +253,9 @@ class apply_jsone_templates(object):
"""
template_dir = os.path.join(here, 'templates')
def __init__(self, templates):
self.templates = templates
def __init__(self, try_task_config):
self.templates = try_task_config.get('templates')
self.target_tasks = try_task_config.get('tasks')
def __call__(self, taskgraph, label_to_taskid):
if not self.templates:
@ -270,6 +271,8 @@ class apply_jsone_templates(object):
'input': self.templates[template],
# The following context differs from action tasks
'attributes': task.attributes,
'label': task.label,
'target_tasks': self.target_tasks,
}
template_path = os.path.join(self.template_dir, template + '.yml')
@ -290,7 +293,7 @@ def morph(taskgraph, label_to_taskid, parameters):
add_s3_uploader_task,
]
if parameters['try_mode'] == 'try_task_config':
morphs.append(apply_jsone_templates(parameters['try_task_config'].get('templates')))
morphs.append(apply_jsone_templates(parameters['try_task_config']))
for m in morphs:
taskgraph, label_to_taskid = m(taskgraph, label_to_taskid)

Просмотреть файл

@ -0,0 +1,8 @@
---
$if: label in target_tasks
then:
attributes:
$merge:
- $eval: attributes
- task_duplicates:
$eval: input

Просмотреть файл

@ -138,7 +138,12 @@ class TestApplyJSONeTemplates(MorphTestCase):
t['label']: Task(**t) for t in self.tasks[:]
})
fn = morph.apply_jsone_templates({'artifact': {'enabled': 1}})
try_task_config = {
'templates': {
'artifact': {'enabled': 1}
},
}
fn = morph.apply_jsone_templates(try_task_config)
morphed = fn(tg, label_to_taskid)[0]
self.assertEqual(len(morphed.tasks), 2)
@ -158,7 +163,15 @@ class TestApplyJSONeTemplates(MorphTestCase):
t['label']: Task(**t) for t in self.tasks[:]
})
fn = morph.apply_jsone_templates({'env': {'ENABLED': 1, 'FOO': 'BAZ'}})
try_task_config = {
'templates': {
'env': {
'ENABLED': 1,
'FOO': 'BAZ',
}
},
}
fn = morph.apply_jsone_templates(try_task_config)
morphed = fn(tg, label_to_taskid)[0]
self.assertEqual(len(morphed.tasks), 2)
@ -167,7 +180,10 @@ class TestApplyJSONeTemplates(MorphTestCase):
self.assertEqual(t.task['payload']['env']['ENABLED'], 1)
self.assertEqual(t.task['payload']['env']['FOO'], 'BAZ')
fn = morph.apply_jsone_templates({'env': {'ENABLED': 0}})
try_task_config['templates']['env'] = {
'ENABLED': 0,
}
fn = morph.apply_jsone_templates(try_task_config)
morphed = fn(tg, label_to_taskid)[0]
self.assertEqual(len(morphed.tasks), 2)
@ -176,6 +192,28 @@ class TestApplyJSONeTemplates(MorphTestCase):
self.assertEqual(t.task['payload']['env']['ENABLED'], 0)
self.assertEqual(t.task['payload']['env']['FOO'], 'BAZ')
def test_template_rebuild(self):
tg, label_to_taskid = self.make_taskgraph({
t['label']: Task(**t) for t in self.tasks[:]
})
try_task_config = {
'tasks': ['b'],
'templates': {
'rebuild': 4,
},
}
fn = morph.apply_jsone_templates(try_task_config)
tasks = fn(tg, label_to_taskid)[0].tasks.values()
self.assertEqual(len(tasks), 2)
for t in tasks:
if t.label == 'a':
self.assertNotIn('task_duplicates', t.attributes)
elif t.label == 'b':
self.assertIn('task_duplicates', t.attributes)
self.assertEqual(t.attributes['task_duplicates'], 4)
if __name__ == '__main__':
main()