@@ -210,14 +210,17 @@ def rewrite_mirrored_dependencies(
210
210
prefix : str ,
211
211
dependencies : dict [str , str ],
212
212
tasks : dict [str , Any ],
213
- patterns : list [re .Pattern ],
213
+ include_deps : list [str ],
214
+ artifact_tasks ,
214
215
):
215
216
"""Re-write dependencies and fetches of tasks that are being re-run in the
216
217
staging instance that are also being re-run in the staging instance. Without
217
218
this, the downstream tasks will attempt to refer to firefoxci task ids that
218
219
do not exist in the staging cluster, and task submission will fail.
219
220
"""
221
+ patterns = [re .compile (p ) for p in include_deps ]
220
222
modified_deps = set ()
223
+ mirrored_deps = set ()
221
224
# First, update any dependencies that are also being run as part of this integration test
222
225
for upstream_task_id in dependencies :
223
226
if upstream_task_id in tasks :
@@ -227,6 +230,15 @@ def rewrite_mirrored_dependencies(
227
230
upstream_task_label = f"{ prefix } -{ name } "
228
231
taskdesc ["dependencies" ][upstream_task_label ] = upstream_task_label
229
232
233
+ artifact_task_label = f"firefoxci-artifact-{ prefix } -{ upstream_task_id } "
234
+ # TODO: shouldn't add docker images here; they get added already elsewhere
235
+ if artifact_task_label in artifact_tasks :
236
+ fetched_artifacts = artifact_tasks [artifact_task_label ].task ["payload" ]["env" ]["FETCH_FIREFOXCI_ARTIFACTS" ]
237
+ if "image.tar.zst" in fetched_artifacts :
238
+ continue
239
+ mirrored_deps .add (upstream_task_id )
240
+ taskdesc ["dependencies" ][artifact_task_label ] = artifact_task_label
241
+
230
242
# Second, update any fetches that point to dependencies that are also being run as part
231
243
# of this integration test
232
244
updated_fetches = []
@@ -241,6 +253,9 @@ def rewrite_mirrored_dependencies(
241
253
fetch_task_label = tasks [fetch_task_id ]["metadata" ]["name" ]
242
254
fetch ["task" ] = f"<{ prefix } -{ fetch_task_label } >"
243
255
256
+ if fetch_task_id in mirrored_deps :
257
+ fetch ["task" ] = f"<firefoxci-artifact-{ prefix } -{ fetch_task_id } >"
258
+
244
259
updated_fetches .append (fetch )
245
260
246
261
taskdesc ["task" ]["payload" ]["env" ]["MOZ_FETCHES" ] = {
@@ -253,6 +268,8 @@ def make_integration_test_description(
253
268
name_prefix : str ,
254
269
tasks : dict [str , Any ],
255
270
include_deps : list [str ],
271
+ should_patch_root_url : bool ,
272
+ artifact_tasks ,
256
273
):
257
274
"""Schedule a task on the staging Taskcluster instance.
258
275
@@ -274,30 +291,6 @@ def make_integration_test_description(
274
291
if "treeherder" in task_def ["extra" ]:
275
292
del task_def ["extra" ]["treeherder" ]
276
293
277
- include_patterns = [re .compile (p ) for p in include_deps ]
278
- # Tasks may only have 1 root url set, which is primarily used to decide
279
- # where to find `MOZ_FETCHES`. When we're including dependencies, we peek
280
- # at upstream tasks to figure out what this should be set to. If any
281
- # upstream task is present that doesn't match an include pattern, its
282
- # dependencies must be pulled from the firefox ci cluster, and we must
283
- # patch the root. If a task matches an include pattern, its dependencies
284
- # will be in the staging cluster, and we must not patch the root.
285
- # If we have a mix of tasks, we cannot proceed.
286
- matches = set ()
287
- for upstream_task_id in orig_dependencies :
288
- if upstream_task_id in tasks :
289
- name = tasks [upstream_task_id ]["metadata" ]["name" ]
290
- matches .add (any ([pat .match (name ) for pat in include_patterns ]))
291
-
292
- should_patch_root_url = True
293
- if len (matches ) == 2 :
294
- raise Exception (
295
- f"task '{ task_def ['metadata' ]['name' ]} ' has both mirrored and unmirrored dependencies; it will not work correctly"
296
- )
297
- elif len (matches ) == 1 :
298
- if matches .pop () is True :
299
- should_patch_root_url = False
300
-
301
294
if should_patch_root_url :
302
295
patch_root_url (task_def )
303
296
rewrite_mounts (task_def )
@@ -328,7 +321,7 @@ def make_integration_test_description(
328
321
rewrite_docker_image (taskdesc )
329
322
rewrite_private_fetches (taskdesc )
330
323
rewrite_mirrored_dependencies (
331
- taskdesc , name_prefix , orig_dependencies , tasks , include_patterns
324
+ taskdesc , name_prefix , orig_dependencies , tasks , include_deps , artifact_tasks ,
332
325
)
333
326
return taskdesc
334
327
@@ -341,10 +334,12 @@ def schedule_tasks_at_index(config, tasks):
341
334
if os .environ ["TASKCLUSTER_ROOT_URL" ] != STAGING_ROOT_URL :
342
335
return
343
336
337
+ artifact_tasks = {k : v for k , v in config .kind_dependencies_tasks .items () if k .startswith ("firefoxci-artifact" )}
344
338
for task in tasks :
345
339
include_attrs = task .pop ("include-attrs" , {})
346
340
exclude_attrs = task .pop ("exclude-attrs" , {})
347
341
include_deps = task .pop ("include-deps" , [])
342
+ patch_root_url = task .pop ("patch-root-url" , True )
348
343
for decision_index_path in task .pop ("decision-index-paths" ):
349
344
found_tasks = find_tasks (
350
345
decision_index_path ,
@@ -356,5 +351,5 @@ def schedule_tasks_at_index(config, tasks):
356
351
# task_def is copied to avoid modifying the version in `tasks`, which
357
352
# may be used to modify parts of the new task description
358
353
yield make_integration_test_description (
359
- copy .deepcopy (task_def ), task ["name" ], found_tasks , include_deps
354
+ copy .deepcopy (task_def ), task ["name" ], found_tasks , include_deps , patch_root_url , artifact_tasks
360
355
)
0 commit comments