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
}