func SetupTf()

in e2etestrunner/setuptf/setuptf.go [81:156]


func SetupTf(
	ctx context.Context,
	projectID string,
	testRunID string,
	tfDir string, // the Dir to set when running terraform commands in e.g. tf/gke
	tfVars map[string]string, // key-values for terraform input vars to send to terraform
	logger *log.Logger,
) (*PubsubInfo, func(), error) {
	tfVarArgs := tfVarMapToArgs(projectID, tfVars)
	cmd := initCommand(ctx, projectID)
	cmd.Args = append(cmd.Args, tfVarArgs...)
	cmd.Dir = tfDir
	if err := runWithOutput(cmd, logger); err != nil {
		return nil, func() {}, err
	}

	cleanup := func() {
		defer deleteWorkspace(ctx, testRunID, tfDir, logger)

		// Run terraform destroy
		cmd = exec.CommandContext(
			ctx,
			"terraform",
			"destroy",
			"-input=false",
			"-auto-approve",
		)
		cmd.Args = append(cmd.Args, tfVarArgs...)
		cmd.Dir = tfDir
		if err := runWithOutput(cmd, logger); err != nil {
			logger.Panic(err)
		}
	}

	// Create new terraform workspace
	cmd = exec.CommandContext(ctx, "terraform", "workspace", "new", testRunID)
	cmd.Dir = tfDir
	if err := runWithOutput(cmd, logger); err != nil {
		// try to switch to workspace if it already exists
		cmd = exec.CommandContext(ctx, "terraform", "workspace", "select", testRunID)
		cmd.Dir = tfDir

		if err := runWithOutput(cmd, logger); err != nil {
			return nil, cleanup, err
		}
	}

	// Run terraform apply
	cmd = exec.CommandContext(
		ctx,
		"terraform",
		"apply",
		"-input=false",
		"-auto-approve",
	)
	cmd.Args = append(cmd.Args, tfVarArgs...)
	cmd.Dir = tfDir
	if err := runWithOutput(cmd, logger); err != nil {
		return nil, cleanup, err
	}

	// Run terraform output
	cmd = exec.CommandContext(ctx, "terraform", "output", "-json")
	cmd.Dir = tfDir
	out, err := cmd.Output()
	if err != nil {
		logger.Println(err)
		return nil, cleanup, err
	}

	tfOutput := &tfOutput{}
	if err := json.Unmarshal(out, tfOutput); err != nil {
		return nil, cleanup, err
	}
	return &tfOutput.PubsubInfoWrapper.Value, cleanup, nil
}