func()

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
}