blob: 624afc77d665ab37a6d793745fbf25ba36de751f [file] [log] [blame]
# 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 import recipe_test_api
from PB.go.chromium.org.luci.buildbucket.proto import (
builds_service as builds_service_pb2,
)
from PB.go.chromium.org.luci.led.job import job as job_pb2
class SubbuildTestApi(recipe_test_api.RecipeTestApi):
def ci_build_message(
self, builder, input_props=None, output_props=None, **kwargs
):
"""Generates a CI Buildbucket Build message.
Args:
builder (str): The builder name.
input_props (Dict): Input properties to set on the build.
output_props (Dict): Output properties to set on the build.
kwargs: Forwarded to BuildbucketApi.ci_build_message.
See BuildBucketTestApi.ci_build_message for full parameter documentation.
"""
project = kwargs.pop("project", "fuchsia")
msg = self.m.buildbucket.ci_build_message(
builder=builder, project=project, **kwargs
)
msg.infra.swarming.task_id = "abc123"
msg.input.properties.update(input_props if input_props else {})
msg.output.properties.update(output_props if output_props else {})
return msg
def try_build_message(
self, builder, input_props=None, output_props=None, **kwargs
):
"""Generates a try Buildbucket Build message.
Args:
builder (str): The builder name.
input_props (Dict): Input properties to set on the build.
output_props (Dict): Output properties to set on the build.
kwargs: Forwarded to BuildbucketApi.try_build_message.
See BuildBucketTestApi.try_build_message for full parameter documentation.
"""
project = kwargs.pop("project", "fuchsia")
msg = self.m.buildbucket.try_build_message(
builder=builder, project=project, **kwargs
)
msg.infra.swarming.task_id = "abc123"
msg.input.properties.update(input_props if input_props else {})
msg.output.properties.update(output_props if output_props else {})
return msg
def child_build_steps(
self,
builds,
launch_step="build",
collect_step="build",
collect_attempt=1
):
"""Generates step data to schedule and collect from child builds.
Args:
builds (list(build_pb2.Build)): The builds to schedule and collect from.
"""
responses = []
for build in builds:
responses.append(
dict(schedule_build=dict(id=build.id, builder=build.builder))
)
mock_schedule_data = self.m.buildbucket.simulated_schedule_output(
step_name=f"{launch_step}.schedule",
batch_response=builds_service_pb2.BatchResponse(responses=responses),
)
index = "" if collect_attempt <= 1 else (f" ({collect_attempt})")
mock_collect_data = self.m.buildbucket.simulated_collect_output(
step_name=f"{collect_step}.collect{index}",
builds=builds,
)
return mock_schedule_data + mock_collect_data
def child_led_steps(
self,
builds,
collect_step="build",
):
"""Generates step data to schedule and collect from child builds.
Args:
builds (list(build_pb2.Build)): The builds to schedule and collect from.
"""
step_data = []
task_results = []
i = 0
for build in builds:
i += 1
suffix = ""
if i > 1:
suffix = f" ({int(i)})"
task_id = f"fake-task-id-{int(i)}"
# led launch mock will take ....infra.swarming.task_id as this
# build's launched swarming ID.
jd = job_pb2.Definition()
jd.buildbucket.bbagent_args.build.CopyFrom(build)
jd.buildbucket.bbagent_args.build.infra.swarming.task_id = task_id
step_data.append(
self.m.led.mock_get_builder(
jd,
build.builder.project,
build.builder.bucket,
build.builder.builder,
)
)
task_results.append(
self.m.swarming.task_result(id=task_id, name=build.builder.builder)
)
step_data.append(
self.step_data(
f"{collect_step}.read build.proto.json{suffix}",
self.m.file.read_proto(build),
)
)
ret = self.step_data(
f"{collect_step}.collect", self.m.swarming.collect(task_results)
)
for s in step_data:
ret += s
return ret