in magefile.go [3009:3159]
func createTestRunner(matrix bool, singleTest string, goTestFlags string, batches ...define.Batch) (*runner.Runner, error) {
goVersion, err := mage.DefaultBeatBuildVariableSources.GetGoVersion()
if err != nil {
return nil, err
}
agentVersion, agentStackVersion, err := getTestRunnerVersions()
if err != nil {
return nil, err
}
agentBuildDir := os.Getenv("AGENT_BUILD_DIR")
if agentBuildDir == "" {
agentBuildDir = filepath.Join("build", "distributions")
}
essToken, ok, err := ess.GetESSAPIKey()
if err != nil {
return nil, err
}
if !ok {
return nil, fmt.Errorf("ESS api key missing; run 'mage integration:auth'")
}
// Possible to change the region for deployment, default is gcp-us-west2 which is
// the CFT region.
essRegion := os.Getenv("TEST_INTEG_AUTH_ESS_REGION")
if essRegion == "" {
essRegion = "gcp-us-west2"
}
serviceTokenPath, ok, err := getGCEServiceTokenPath()
if err != nil {
return nil, err
}
if !ok {
return nil, fmt.Errorf("GCE service token missing; run 'mage integration:auth'")
}
datacenter := os.Getenv("TEST_INTEG_AUTH_GCP_DATACENTER")
if datacenter == "" {
// us-central1-a is used because T2A instances required for ARM64 testing are only
// available in the central regions
datacenter = "us-central1-a"
}
ogcCfg := ogc.Config{
ServiceTokenPath: serviceTokenPath,
Datacenter: datacenter,
}
var instanceProvisioner tcommon.InstanceProvisioner
instanceProvisionerMode := os.Getenv("INSTANCE_PROVISIONER")
switch instanceProvisionerMode {
case "", ogc.Name:
instanceProvisionerMode = ogc.Name
instanceProvisioner, err = ogc.NewProvisioner(ogcCfg)
case multipass.Name:
instanceProvisioner = multipass.NewProvisioner()
case kind.Name:
instanceProvisioner = kind.NewProvisioner()
default:
return nil, fmt.Errorf("INSTANCE_PROVISIONER environment variable must be one of 'ogc' or 'multipass', not %s", instanceProvisionerMode)
}
email, err := ogcCfg.ClientEmail()
if err != nil {
return nil, err
}
provisionCfg := ess.ProvisionerConfig{
Identifier: fmt.Sprintf("at-%s", strings.Replace(strings.Split(email, "@")[0], ".", "-", -1)),
APIKey: essToken,
Region: essRegion,
}
var stackProvisioner tcommon.StackProvisioner
stackProvisionerMode := os.Getenv("STACK_PROVISIONER")
switch stackProvisionerMode {
case "", ess.ProvisionerStateful:
stackProvisionerMode = ess.ProvisionerStateful
stackProvisioner, err = ess.NewProvisioner(provisionCfg)
if err != nil {
return nil, err
}
case ess.ProvisionerServerless:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
stackProvisioner, err = ess.NewServerlessProvisioner(ctx, provisionCfg)
if err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("STACK_PROVISIONER environment variable must be one of %q or %q, not %s",
ess.ProvisionerStateful,
ess.ProvisionerServerless,
stackProvisionerMode)
}
timestamp := timestampEnabled()
extraEnv := map[string]string{}
if agentCollectDiag := os.Getenv("AGENT_COLLECT_DIAG"); agentCollectDiag != "" {
extraEnv["AGENT_COLLECT_DIAG"] = agentCollectDiag
}
if agentKeepInstalled := os.Getenv("AGENT_KEEP_INSTALLED"); agentKeepInstalled != "" {
extraEnv["AGENT_KEEP_INSTALLED"] = agentKeepInstalled
}
extraEnv["TEST_LONG_RUNNING"] = os.Getenv("TEST_LONG_RUNNING")
extraEnv["LONG_TEST_RUNTIME"] = os.Getenv("LONG_TEST_RUNTIME")
// these following two env vars are currently not used by anything, but can be used in the future to test beats or
// other binaries, see https://github.com/elastic/elastic-agent/pull/3258
binaryName := os.Getenv("TEST_BINARY_NAME")
if binaryName == "" {
binaryName = "elastic-agent"
}
repoDir := os.Getenv("TEST_INTEG_REPO_PATH")
if repoDir == "" {
repoDir = "."
}
diagDir := filepath.Join("build", "diagnostics")
_ = os.MkdirAll(diagDir, 0o755)
cfg := tcommon.Config{
AgentVersion: agentVersion,
StackVersion: agentStackVersion,
BuildDir: agentBuildDir,
GOVersion: goVersion,
RepoDir: repoDir,
DiagnosticsDir: diagDir,
StateDir: ".integration-cache",
Platforms: testPlatforms(),
Packages: testPackages(),
Groups: testGroups(),
Matrix: matrix,
SingleTest: singleTest,
VerboseMode: mg.Verbose(),
Timestamp: timestamp,
TestFlags: goTestFlags,
ExtraEnv: extraEnv,
BinaryName: binaryName,
}
r, err := runner.NewRunner(cfg, instanceProvisioner, stackProvisioner, batches...)
if err != nil {
return nil, fmt.Errorf("failed to create runner: %w", err)
}
return r, nil
}