in internal/servicedeployer/terraform.go [97:173]
func (tsd TerraformServiceDeployer) SetUp(ctx context.Context, svcInfo ServiceInfo) (DeployedService, error) {
logger.Debug("setting up service using Terraform deployer")
configDir, err := tsd.installDockerfile(deployerFolderName(svcInfo))
if err != nil {
return nil, fmt.Errorf("can't install Docker Compose definitions: %w", err)
}
ymlPaths := []string{filepath.Join(configDir, terraformDeployerYml)}
envYmlPath := filepath.Join(tsd.definitionsDir, envYmlFile)
_, err = os.Stat(envYmlPath)
if err == nil {
ymlPaths = append(ymlPaths, envYmlPath)
}
tfEnvironment := tsd.buildTerraformExecutorEnvironment(svcInfo)
service := dockerComposeDeployedService{
ymlPaths: ymlPaths,
project: fmt.Sprintf("elastic-package-service-%s", svcInfo.Test.RunID),
env: tfEnvironment,
shutdownTimeout: 300 * time.Second,
configDir: configDir,
}
p, err := compose.NewProject(service.project, service.ymlPaths...)
if err != nil {
return nil, fmt.Errorf("could not create Docker Compose project for service: %w", err)
}
// Clean service logs
err = files.RemoveContent(svcInfo.Logs.Folder.Local)
if err != nil {
return nil, fmt.Errorf("removing service logs failed: %w", err)
}
opts := compose.CommandOptions{
Env: service.env,
}
// Set custom aliases, which may be used in agent policies.
serviceComposeConfig, err := p.Config(ctx, opts)
if err != nil {
return nil, fmt.Errorf("could not get Docker Compose configuration for service: %w", err)
}
svcInfo.CustomProperties, err = buildTerraformAliases(serviceComposeConfig)
if err != nil {
return nil, fmt.Errorf("can't build Terraform aliases: %w", err)
}
// Boot up service
opts = compose.CommandOptions{
Env: service.env,
ExtraArgs: []string{"--build", "-d"},
}
err = p.Up(ctx, opts)
if err != nil {
return nil, fmt.Errorf("could not boot up service using Docker Compose: %w", err)
}
err = p.WaitForHealthy(ctx, opts)
if err != nil {
processServiceContainerLogs(ctx, p, compose.CommandOptions{
Env: opts.Env,
}, svcInfo.Name)
//lint:ignore ST1005 error starting with product name can be capitalized
return nil, fmt.Errorf("Terraform deployer is unhealthy: %w", err)
}
svcInfo.Agent.Host.NamePrefix = "docker-fleet-agent"
err = addTerraformOutputs(&svcInfo)
if err != nil {
return nil, fmt.Errorf("could not handle terraform output: %w", err)
}
service.svcInfo = svcInfo
return &service, nil
}