| # Copyright 2020 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from recipe_engine.recipe_api import Property |
| from recipe_engine.config import List |
| from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb2 |
| from PB.recipe_modules.recipe_engine.led.properties import ( |
| InputProperties as LedInputProperties, |
| ) |
| |
| DEPS = [ |
| "fuchsia/buildbucket_util", |
| "flutter/subbuild", |
| "recipe_engine/properties", |
| "recipe_engine/step", |
| ] |
| |
| PROPERTIES = { |
| "builder_names": |
| Property(kind=List(str), help="The names of the builders to launch"), |
| "extra_properties": |
| Property( |
| kind=dict, |
| help="The extra properties to launch the subbuilds with", |
| default=None, |
| ), |
| } |
| |
| |
| def RunSteps(api, builder_names, extra_properties): |
| with api.step.nest("launch builds") as presentation: |
| builds = api.subbuild.launch( |
| builder_names, presentation, extra_properties=extra_properties |
| ) |
| with api.step.nest("collect builds", status="last"): |
| builds = api.subbuild.collect([build.build_id for build in builds.values()]) |
| for build in builds.values(): |
| if build.build_proto.status != common_pb2.SUCCESS: |
| raise api.step.StepFailure(f"build {build.build_id} failed") |
| assert api.subbuild.get_property( |
| build.build_proto, "test_orchestration_inputs_hash" |
| ) |
| |
| |
| def GenTests(api): |
| ci_subbuild1 = api.subbuild.ci_build_message( |
| build_id=8945511751514863184, |
| builder="builder-subbuild1", |
| output_props={"test_orchestration_inputs_hash": "abc"}, |
| status="SUCCESS", |
| ) |
| ci_subbuild2 = api.subbuild.ci_build_message( |
| build_id=8945511751514863185, |
| builder="builder-subbuild2", |
| output_props={"test_orchestration_inputs_hash": "abc"}, |
| status="SUCCESS", |
| ) |
| try_subbuild1 = api.subbuild.try_build_message( |
| build_id=8945511751514863186, |
| builder="builder-subbuild1", |
| output_props={"test_orchestration_inputs_hash": "abc"}, |
| status="SUCCESS", |
| ) |
| try_subbuild2 = api.subbuild.try_build_message( |
| build_id=8945511751514863187, |
| builder="builder-subbuild2", |
| output_props={"test_orchestration_inputs_hash": "abc"}, |
| status="SUCCESS", |
| ) |
| subbuild_missing_property = api.subbuild.try_build_message( |
| build_id=8945511751514863187, |
| builder="builder-subbuild2", |
| output_props={}, |
| status="SUCCESS", |
| ) |
| failed_subbuild = api.subbuild.try_build_message( |
| build_id=8945511751514863187, |
| builder="builder-subbuild2", |
| status="FAILURE", |
| ) |
| |
| def properties(project=None, bucket=None, **kwargs): |
| if project: |
| assert bucket |
| project = f"{project}/" if project else "" |
| bucket = f"{bucket}/" if bucket else "" |
| props = dict( |
| builder_names=[ |
| f"{project}{bucket}builder-subbuild1", |
| "builder-subbuild2", |
| ], |
| extra_properties={ |
| "parent_id": "parentid", |
| # This should be passed through from the parent to the subbuild. |
| "integration_base_revision": "abc123", |
| }, |
| ) |
| props.update(**kwargs) |
| return api.properties(**props) |
| |
| # Use different sets of options for different cases so we get coverage of |
| # the logic to split the builder name without adding more tests. |
| |
| def ci_properties(**kwargs): |
| return properties(project="fuchsia", bucket="ci", **kwargs) |
| |
| def try_properties(**kwargs): |
| return properties(bucket="try", **kwargs) |
| |
| yield ( |
| api.buildbucket_util.test("launch_builds_ci") + ci_properties() + |
| api.subbuild.child_build_steps( |
| builds=[ci_subbuild1, ci_subbuild2], |
| launch_step="launch builds", |
| collect_step="collect builds", |
| ) |
| ) |
| |
| yield ( |
| api.buildbucket_util.test("missing_property", status="INFRA_FAILURE") + |
| properties() + api.subbuild.child_build_steps( |
| builds=[subbuild_missing_property], |
| launch_step="launch builds", |
| collect_step="collect builds", |
| ) |
| ) |
| |
| yield ( |
| api.buildbucket_util.test("launch_builds_with_led_ci") + ci_properties( |
| **{ |
| "$recipe_engine/led": |
| LedInputProperties(led_run_id="led/user_example.com/abc123",), |
| } |
| ) + api.subbuild.child_led_steps( |
| builds=[ci_subbuild1, ci_subbuild2], |
| collect_step="collect builds", |
| ) |
| ) |
| |
| yield ( |
| api.buildbucket_util.test("launch_builds_with_led_cq", tryjob=True) + |
| try_properties( |
| **{ |
| "$recipe_engine/led": |
| LedInputProperties(led_run_id="led/user_example.com/abc123",), |
| } |
| ) + api.subbuild.child_led_steps( |
| builds=[try_subbuild1, try_subbuild2], |
| collect_step="collect builds", |
| ) |
| ) |
| |
| yield ( |
| api.buildbucket_util |
| .test("failed_subbuild", tryjob=True, status="FAILURE") + properties() + |
| api.subbuild.child_build_steps( |
| builds=[failed_subbuild], |
| launch_step="launch builds", |
| collect_step="collect builds", |
| ) |
| ) |