blob: 50afc72b417da3f80494b78064ed6c8b895cb489 [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 helpers
import (
"go.chromium.org/chromiumos/config/go/test/api"
"go.chromium.org/chromiumos/test/ctpv2/common/dynamic_updates"
"go.chromium.org/chromiumos/test/ctpv2/common/dynamic_updates/builders"
"go.chromium.org/chromiumos/test/ctpv2/common/dynamic_updates/common"
"go.chromium.org/chromiumos/test/ctpv2/common/dynamic_updates/generators"
"go.chromium.org/chromiumos/test/ctpv2/common/dynamic_updates/interfaces"
dut_api "go.chromium.org/chromiumos/config/go/test/lab/api"
)
var (
// Commonly used base-keys in the dynamic
// lookup table.
InstallPath = LookupKey("installPath")
Board = LookupKey("board")
AndroidBoard = LookupKey("androidBoard")
)
// CrosProvisionLookupValues adds a concrete helper layer
// for defining which values are being loaded into the dynamic
// lookup table.
type CrosProvisionLookupValues struct {
Board string
InstallPath string
}
// AndroidProvisionLookupValues adds a concrete helper layer
// for defining which values are being loaded into the dynamic
// lookup table.
type AndroidProvisionLookupValues struct {
Board string
}
// DynamicProvisionHelper tracks the count of provision types
// relating to lookup keys.
type DynamicProvisionHelper struct {
crosProvisionCount int
androidProvisionCount int
}
// NewDynamicProvisionHelper creates an initialized helper
// with counts set to 0.
func NewDynamicProvisionHelper() *DynamicProvisionHelper {
return &DynamicProvisionHelper{
crosProvisionCount: 0,
androidProvisionCount: 0,
}
}
// ApplyCrosProvisionToLookup adds the cros provision lookup values to the lookup table
// using the globally defined common lookup keys.
// Increments the counter.
func (LH *DynamicProvisionHelper) ApplyCrosProvisionToLookup(lookupTable map[string]string, values *CrosProvisionLookupValues) {
count := LH.crosProvisionCount
lookupTable[Board.WithIndex(count).AsKey()] = values.Board
lookupTable[InstallPath.WithIndex(count).AsKey()] = values.InstallPath
LH.crosProvisionCount += 1
}
// ApplyAndroidProvisionToLookup adds the android provision lookup values to the lookup table
// using the globally defined common lookup keys.
// Increments the counter.
func (LH *DynamicProvisionHelper) ApplyAndroidProvisionToLookup(lookupTable map[string]string, values *AndroidProvisionLookupValues) {
count := LH.androidProvisionCount
lookupTable[AndroidBoard.WithIndex(count).AsKey()] = values.Board
LH.androidProvisionCount += 1
}
func (LH *DynamicProvisionHelper) GenerateProvisionRequest(req *api.InternalTestplan, swarmingDef *api.SwarmingDefinition, isPrimary bool) error {
var taskId *common.TaskIdentifier
var provisionContainer *builders.ContainerBuilder
var provisionInstallRequest *interfaces.ProvisionTaskInstallRequest
deviceId := LH.getDeviceIdentifier(swarmingDef, isPrimary)
switch swarmingDef.GetDutInfo().GetDutType().(type) {
case *dut_api.Dut_Chromeos:
taskId = common.NewTaskIdentifier(common.CrosProvision).AddDeviceId(deviceId)
provisionContainer = NewCrosProvisionContainer(taskId)
installPath := InstallPath.WithIndex(LH.crosProvisionCount).AsPlaceholder()
provisionInstallRequest = DefaultCrosProvisionInstallRequest(installPath)
LH.crosProvisionCount += 1
case *dut_api.Dut_Android_:
taskId = common.NewTaskIdentifier(common.AndroidProvision).AddDeviceId(deviceId)
provisionContainer = NewAndroidProvisionContainer(taskId)
provisionInstallRequest = DefaultAndroidProvisionInstallRequest()
LH.androidProvisionCount += 1
default:
return nil
}
return GenerateProvisionRequest(
req, taskId, deviceId,
[]*builders.ContainerBuilder{
NewCrosDutContainer(deviceId),
provisionContainer,
},
provisionInstallRequest)
}
// getDeviceIdentifier grabs the correct placeholder value
// for the various flavors of dut types.
func (LH *DynamicProvisionHelper) getDeviceIdentifier(swarmingDef *api.SwarmingDefinition, isPrimary bool) *common.DeviceIdentifier {
if isPrimary {
return common.NewPrimaryDeviceIdentifier()
}
switch swarmingDef.GetDutInfo().GetDutType().(type) {
case *dut_api.Dut_Chromeos:
return common.NewCompanionDeviceIdentifier(Board.WithIndex(LH.crosProvisionCount).AsPlaceholder())
case *dut_api.Dut_Android_:
return common.NewCompanionDeviceIdentifier(AndroidBoard.WithIndex(LH.androidProvisionCount).AsPlaceholder())
}
return nil
}
// GenerateProvisionRequest provides some defaults for a provision request,
// while also requiring some variable inputs between differing flavors.
func GenerateProvisionRequest(
req *api.InternalTestplan,
taskId *common.TaskIdentifier,
deviceId *common.DeviceIdentifier,
provisionContainers []*builders.ContainerBuilder,
provisionInstallRequest *interfaces.ProvisionTaskInstallRequest) error {
provisionGenerator := generators.NewProvisionTaskGenerator(
taskId.Id, taskId.Id, deviceId.Id,
provisionContainers,
common.PrependTaskWrapper(common.FindFirst(api.FocalTaskFinder_TEST)),
DefaultProvisionStartUpRequest(deviceId),
provisionInstallRequest,
)
return dynamic_updates.AppendUserDefinedDynamicUpdates(&req.SuiteInfo.SuiteMetadata.DynamicUpdates, provisionGenerator.Generate)
}