blob: eef979311dcb5bdd2bd910b19f251bfc082dfa63 [file]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Package lucifer provides Go bindings for running lucifer.
package lucifer
import (
"os/exec"
"path/filepath"
"strings"
"infra/cmd/skylab_swarming_worker/internal/autotest/constants"
"go.chromium.org/luci/common/flag"
)
// Config contains information needed to run Lucifer commands.
type Config struct {
// BinDir is the directory containing Lucifer binaries.
BinDir string
AutotestPath string
LabpackDir string
}
// XLevel is an enum for the available Lucifer handoff levels. This
// is a transitory concept while the Autotest scheduler is being
// migrated to use Lucifer.
type XLevel string
// Lucifer level constants.
const (
LuciferLevelStarting XLevel = "STARTING"
LuciferLevelSkylabProvision XLevel = "SKYLAB_PROVISION"
)
// TaskArgs contains the arguments shared between all Lucifer task
// types. This can be used to facilitate share common setup code.
type TaskArgs struct {
AbortSock string
GCPProject string
ResultsDir string
LogDogFile string
}
// TestArgs contains the arguments for creating a lucifer test
// command. This only includes the subset of the available arguments
// that is currently needed.
type TestArgs struct {
TaskArgs
Hosts []string
TaskName string
XTestArgs string
XClientTest bool
XJobOwner string
XKeyvals map[string]string
XLevel XLevel
XLocalOnlyHostInfo bool
XPrejobTask constants.AdminTaskType
XProvisionLabels []string
}
// TestCommand creates an exec.Cmd for running a lucifer test.
func TestCommand(c Config, r TestArgs) *exec.Cmd {
p := filepath.Join(c.BinDir, "lucifer")
args := make([]string, 0, 20)
args = append(args, "test")
args = append(args, "-autotestdir", c.AutotestPath)
args = append(args, "-labpackdir", c.LabpackDir)
args = appendCommonArgs(args, r.TaskArgs)
args = append(args, "-hosts", strings.Join(r.Hosts, ","))
args = append(args, "-task-name", r.TaskName)
if r.XTestArgs != "" {
args = append(args, "-x-test-args", r.XTestArgs)
}
if r.XClientTest {
args = append(args, "-x-client-test")
} else {
// All skylab server tests are run with SSP, but SSP may
// be skipped within autoserv if the control file demands it.
args = append(args, "-x-require-ssp")
}
args = append(args, "-x-keyvals", flag.JSONMap(&r.XKeyvals).String())
args = append(args, "-x-job-owner", r.XJobOwner)
args = append(args, "-x-level", string(r.XLevel))
if r.XLocalOnlyHostInfo {
args = append(args, "-x-local-only-host-info")
}
if r.XPrejobTask != constants.NoTask {
args = append(args, "-x-prejob-task", strings.ToLower(r.XPrejobTask.String()))
}
if len(r.XProvisionLabels) > 0 {
args = append(args, "-x-provision-labels", strings.Join(r.XProvisionLabels, ","))
}
cmd := exec.Command(p, args...)
return cmd
}
// AdminTaskArgs contains the arguments for creating a lucifer admintask command.
type AdminTaskArgs struct {
TaskArgs
Host string
Task string
// The default values for the following are usually fine.
GCPProject string
}
// AdminTaskCommand creates an exec.Cmd for running a lucifer admintask.
func AdminTaskCommand(c Config, a AdminTaskArgs) *exec.Cmd {
p := filepath.Join(c.BinDir, "lucifer")
args := make([]string, 0, 6)
args = append(args, "admintask")
args = append(args, "-autotestdir", c.AutotestPath)
args = append(args, "-labpackdir", c.LabpackDir)
args = appendCommonArgs(args, a.TaskArgs)
args = append(args, "-host", a.Host)
args = append(args, "-task", a.Task)
if a.GCPProject != "" {
args = append(args, "-gcp-project", a.GCPProject)
}
cmd := exec.Command(p, args...)
return cmd
}
// DeployTaskArgs contains the arguments for creating a lucifer deploytask
// command.
type DeployTaskArgs struct {
TaskArgs
Host string
Actions string
}
// DeployTaskCommand creates an exec.Cmd for running a lucifer deploytask.
func DeployTaskCommand(c Config, a DeployTaskArgs) *exec.Cmd {
p := filepath.Join(c.BinDir, "lucifer")
args := make([]string, 0, 6)
args = append(args, "deploytask")
args = append(args, "-autotestdir", c.AutotestPath)
args = append(args, "-labpackdir", c.LabpackDir)
args = appendCommonArgs(args, a.TaskArgs)
args = append(args, "-host", a.Host)
if a.Actions != "" {
args = append(args, "-actions", a.Actions)
}
if a.GCPProject != "" {
args = append(args, "-gcp-project", a.GCPProject)
}
cmd := exec.Command(p, args...)
return cmd
}
// AuditTaskArgs contains the arguments for creating a lucifer audittask command.
type AuditTaskArgs struct {
TaskArgs
Host string
Actions string
}
// AuditTaskCommand creates an exec.Cmd for running a lucifer audittask.
func AuditTaskCommand(c Config, a AuditTaskArgs) *exec.Cmd {
p := filepath.Join(c.BinDir, "lucifer")
args := make([]string, 0, 6)
args = append(args, "audittask")
args = append(args, "-autotestdir", c.AutotestPath)
args = append(args, "-labpackdir", c.LabpackDir)
args = appendCommonArgs(args, a.TaskArgs)
args = append(args, "-host", a.Host)
if a.Actions != "" {
args = append(args, "-actions", a.Actions)
}
if a.GCPProject != "" {
args = append(args, "-gcp-project", a.GCPProject)
}
cmd := exec.Command(p, args...)
return cmd
}
func appendCommonArgs(args []string, a TaskArgs) []string {
args = append(args, "-abortsock", a.AbortSock)
args = append(args, "-gcp-project", a.GCPProject)
args = append(args, "-resultsdir", a.ResultsDir)
if a.LogDogFile != "" {
args = append(args, "-logdog-file", a.LogDogFile)
}
return args
}