blob: e96076d77870446bf5db210f3423a0a8bb1c8840 [file] [log] [blame]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package builders
import (
"go.chromium.org/chromiumos/config/go/test/api"
labapi "go.chromium.org/chromiumos/config/go/test/lab/api"
"go.chromium.org/chromiumos/test/ctpv2/common/dynamic_updates/common"
"go.chromium.org/chromiumos/test/ctpv2/common/dynamic_updates/interfaces"
"go.chromium.org/luci/common/errors"
)
const (
GenericDynamicDepFormat = "%sRequest.message.values.%s"
StartRpc = "start"
RunRpc = "run"
StopRpc = "stop"
)
// GenericTaskBuilder builds out a GenericTask for ease of use within
// generators designed around generic tasks.
type GenericTaskBuilder struct {
Task *api.CrosTestRunnerDynamicRequest_Task
}
// NewGenericTaskBuilder creates a GenericTaskBuilder
// based on the UserContainerGenerator.
func NewGenericTaskBuilder(dynamicId, containerId string) *GenericTaskBuilder {
return &GenericTaskBuilder{
Task: &api.CrosTestRunnerDynamicRequest_Task{
OrderedContainerRequests: []*api.ContainerRequest{},
Task: &api.CrosTestRunnerDynamicRequest_Task_Generic{
Generic: &api.GenericTask{
ServiceAddress: &labapi.IpEndpoint{},
DynamicDeps: []*api.DynamicDep{
{
Key: common.ServiceAddress,
Value: containerId,
},
},
DynamicIdentifier: dynamicId,
},
},
},
}
}
// AddContainerRequest appends the provided container request to the task's OrderedContainerRequests.
func (builder *GenericTaskBuilder) AddContainerRequest(contReq *api.ContainerRequest) {
builder.Task.OrderedContainerRequests = append(builder.Task.OrderedContainerRequests, contReq)
}
// AddStartRequest creates the generic start request and generates the dynamic deps.
func (builder *GenericTaskBuilder) AddStartRequest(start *interfaces.GenericTaskMessageRequest) error {
return builder.addGenericRequest(StartRpc, start)
}
// AddRunRequest creates the generic run request and generates the dynamic deps.
func (builder *GenericTaskBuilder) AddRunRequest(run *interfaces.GenericTaskMessageRequest) error {
return builder.addGenericRequest(RunRpc, run)
}
// AddStopRequest creates the generic stop request and generates the dynamic deps.
func (builder *GenericTaskBuilder) AddStopRequest(stop *interfaces.GenericTaskMessageRequest) error {
return builder.addGenericRequest(StopRpc, stop)
}
// addGenericRequest creates the generic request and generates the dynamic deps.
func (builder *GenericTaskBuilder) addGenericRequest(rpc string, req *interfaces.GenericTaskMessageRequest) error {
genericValues, err := common.ConvertProtoMapToAnyMap(req.StaticInputs)
if err != nil {
return errors.Annotate(err, "failed to add stop request's static inputs").Err()
}
genericMessage := &api.GenericMessage{
Values: genericValues,
}
switch rpc {
case StartRpc:
builder.Task.GetGeneric().StartRequest = &api.GenericStartRequest{
Message: genericMessage,
}
case RunRpc:
builder.Task.GetGeneric().RunRequest = &api.GenericRunRequest{
Message: genericMessage,
}
case StopRpc:
builder.Task.GetGeneric().StopRequest = &api.GenericStopRequest{
Message: genericMessage,
}
default:
return errors.New("unknown rpc for generic task builder")
}
taskDeps := builder.Task.GetGeneric().DynamicDeps
generatedDeps := common.GenerateDynamicDeps(rpc, req.DynamicInputs, GenericDynamicDepFormat)
builder.Task.GetGeneric().DynamicDeps = append(taskDeps, generatedDeps...)
return nil
}