blob: 304794fc30c2bb035f121d7b721fc8c29ac739d3 [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 (
"strings"
"go.chromium.org/chromiumos/config/go/test/api"
)
// CommonContainerVolumes provides the volumes
// that will be provided to each container request.
func CommonContainerVolumes() []string {
return []string{
"/creds:/creds",
}
}
// ContainerBuilder constructs a container request
// with the default assumption of using a generic template.
type ContainerBuilder struct {
// Inputs
ContainerId string
ContainerImageKey string
ContainerImagePath string
ContainerArtifactDir string
Cmd string
// Optional Inputs
ContainerTemplate *api.Template
DynamicDeps []*api.DynamicDep
AdditionalVolumes []string
}
// NewContainerBuilder initializes.
func NewContainerBuilder(contId, imageKey, imagePath, artifactDir, cmd string) *ContainerBuilder {
return &ContainerBuilder{
ContainerId: contId,
ContainerImageKey: imageKey,
ContainerImagePath: imagePath,
ContainerArtifactDir: artifactDir,
Cmd: cmd,
DynamicDeps: []*api.DynamicDep{},
AdditionalVolumes: []string{},
}
}
// SetCustomTemplate overwrites the assumed generic template in place for
// a well defined cros-tool-runner container template.
func (builder *ContainerBuilder) SetCustomTemplate(template *api.Template) {
builder.ContainerTemplate = template
}
func (builder *ContainerBuilder) SetDynamicDeps(deps map[string]string) {
for k, v := range deps {
builder.DynamicDeps = append(builder.DynamicDeps, &api.DynamicDep{
Key: k,
Value: v,
})
}
}
func (builder *ContainerBuilder) SetAdditionalVolumes(volumes []string) {
builder.AdditionalVolumes = append(builder.AdditionalVolumes, volumes...)
}
// Build constructs the container request from the information
// provided to the ContainerBuilder.
func (builder *ContainerBuilder) Build() *api.ContainerRequest {
if builder.ContainerTemplate == nil {
cmds := strings.Split(builder.Cmd, " ")
binaryName := ""
binaryArgs := []string{}
if len(cmds) > 0 {
binaryName = cmds[0]
}
if len(cmds) > 1 {
binaryArgs = cmds[1:]
}
builder.ContainerTemplate = &api.Template{
Container: &api.Template_Generic{
Generic: &api.GenericTemplate{
BinaryName: binaryName,
BinaryArgs: binaryArgs,
DockerArtifactDir: builder.ContainerArtifactDir,
AdditionalVolumes: append(builder.AdditionalVolumes, CommonContainerVolumes()...),
},
},
}
}
return &api.ContainerRequest{
DynamicIdentifier: builder.ContainerId,
Container: builder.ContainerTemplate,
ContainerImageKey: builder.ContainerImageKey,
ContainerImagePath: builder.ContainerImagePath,
DynamicDeps: builder.DynamicDeps,
}
}