8000 helper/resource: Ensure Terraform CLI logs are written to `TF_LOG_PAT… · hashicorp/terraform-plugin-sdk@b8263cd · GitHub
[go: up one dir, main page]

Skip to content

Commit b8263cd

Browse files
authored
helper/resource: Ensure Terraform CLI logs are written to TF_LOG_PATH_MASK environment variable value when both TF_ACC_LOG_PATH and TF_LOG_PATH_MASK are set (#938)
Reference: #922 The code refactoring centralizes all `(tfexec.Terraform).Set*` method calls right after `NewTerraform()` to ensure everything is immediately configured as expected. Verification via terraform-provider-corner after `go mod edit -replace`: ```console $ TF_ACC=1 TF_LOG=TRACE TF_ACC_LOG_PATH=/tmp/oops.txt TF_LOG_PATH_MASK=/tmp/better-%s.txt go test -count=1 -run='TestAccFrameworkResourceUser_interpolateLanguage' -v ./internal/frameworkprovider === RUN TestAccFrameworkResourceUser_interpolateLanguage --- PASS: TestAccFrameworkResourceUser_interpolateLanguage (3.33s) PASS ok github.com/hashicorp/terraform-provider-corner/internal/frameworkprovider 3.659s $ ls /tmp/*.txt /tmp/better-TestAccFrameworkResourceUser_interpolateLanguage.txt /tmp/oops.txt $ cat /tmp/oops.txt $ head -20 /tmp/better-TestAccFrameworkResourceUser_interpolateLanguage.txt 2022-04-12T14:28:37.074-0400 [DEBUG] sdk.helper_resource: Starting TestCase: test_name=TestAccFrameworkResourceUser_interpolateLanguage 2022-04-12T14:28:37.074-0400 [TRACE] sdk.helper_resource: Adding potential Terraform CLI source of local filesystem PATH lookup: test_name=TestAccFrameworkResourceUser_interpolateLanguage 2022-04-12T14:28:37.074-0400 [TRACE] sdk.helper_resource: Adding potential Terraform CLI source of checkpoint.hashicorp.com latest version for installation in: /var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest-terraform902259129: test_name=TestAccFrameworkResourceUser_interpolateLanguage 2022-04-12T14:28:37.075-0400 [DEBUG] sdk.helper_resource: Found Terraform CLI: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform 2022-04-12T14:28:37.075-0400 [TRACE] sdk.helper_resource: Symlinking source directories to work directory: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273/work2021050956 2022-04-12T14:28:37.111-0400 [TRACE] sdk.helper_resource: Setting terraform-exec log path via TF_ACC_LOG_PATH environment variable: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273/work2021050956 test_terraform_log_path=/tmp/oops.txt 2022-04-12T14:28:37.111-0400 [TRACE] sdk.helper_resource: Setting terraform-exec log path via TF_LOG_PATH_MASK environment variable: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273/work2021050956 test_terraform_log_path=/tmp/better-TestAccFrameworkResourceUser_interpolateLanguage.txt 2022-04-12T14:28:37.112-0400 [TRACE] sdk.helper_resource: Clearing Terraform plan: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 2022-04-12T14:28:37.112-0400 [TRACE] sdk.helper_resource: No Terraform plan to clear: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 2022-04-12T14:28:37.112-0400 [DEBUG] sdk.helper_resource: Creating tfprotov6 provider instance: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 tf_provider_addr=registry.terraform.io/hashicorp/framework 2022-04-12T14:28:37.112-0400 [DEBUG] sdk.helper_resource: Created tfprotov6 provider instance: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 tf_provider_addr=registry.terraform.io/hashicorp/framework 2022-04-12T14:28:37.112-0400 [DEBUG] sdk.helper_resource: Starting tfprotov6 provider instance server: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 tf_provider_addr=registry.terraform.io/hashicorp/framework 2022-04-12T14:28:37.113-0400 [DEBUG] sdk.helper_resource: Started tfprotov6 provider instance server: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 tf_provider_addr=registry.terraform.io/hashicorp/framework 2022-04-12T14:28:37.113-0400 [TRACE] sdk.helper_resource: Setting Terraform CLI reattach configuration: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 tf_reattach_config="map[registry.terraform.io/-/framework:{grpc 6 62287 true {unix /var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugin1464887819}} registry.terraform.io/hashicorp/framework:{grpc 6 62287 true {unix /var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugin1464887819}}]" 2022-04-12T14:28:37.113-0400 [TRACE] sdk.helper_resource: Calling wrapped Terraform CLI command: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 2022-04-12T14:28:37.113-0400 [TRACE] sdk.helper_resource: Calling Terraform CLI init command: test_name=TestAccFrameworkResourceUser_interpolateLanguage test_terraform_path=/usr/local/bin/terraform test_working_directory=/var/folders/w8/05f3x02n27x72g0mc2jy6_180000gp/T/plugintest1623391273 2022-04-12T14:28:37.144-0400 [INFO] Terraform version: 1.1.8 2022-04-12T14:28:37.144-0400 [INFO] Go runtime version: go1.17.2 2022-04-12T14:28:37.144-0400 [INFO] CLI args: []string{"/usr/local/bin/terraform", "init", "-no-color", "-force-copy", "-input=false", "-backend=true", "-get=true", "-upgrade=false"} 2022-04-12T14:28:37.144-0400 [TRACE] Stdout is not a terminal ... ```
1 parent 5d701f2 commit b8263cd

File tree

6 files changed

+67
-19
lines changed

6 files changed

+67
-19
lines changed

.changelog/938.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
helper/resource: Ensured Terraform CLI logs are written to `TF_LOG_PATH_MASK` environment variable value when both `TF_ACC_LOG_PATH` and `TF_LOG_PATH_MASK` are set
3+
```

internal/logging/keys.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ const (
3131
// The TestStep number of the test being executed. Starts at 1.
3232
KeyTestStepNumber = "test_step_number"
3333

34+
// The path to the Terraform CLI logging file used for an acceptance test.
35+
//
36+
// This should match where the rest of the acceptance test logs are going
37+
// already, but is provided for troubleshooting in case it does not.
38+
KeyTestTerraformLogPath = "test_terraform_log_path"
39+
3440
// The path to the Terraform CLI used for an acceptance test.
3541
KeyTestTerraformPath = "test_terraform_path"
3642

internal/plugintest/environment_variables.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,19 @@ const (
1414
// testing. This value sets TF_LOG_PATH in a safe manner when executing
1515
// Terraform CLI commands, which would otherwise be ignored since it could
1616
// interfere with how the underlying execution is performed.
17+
//
18+
// If TF_LOG_PATH_MASK is set, it takes precedence over this value.
1719
EnvTfAccLogPath = "TF_ACC_LOG_PATH"
1820

21+
// Environment variable with path containing the string %s, which is
22+
// replaced with the test name, to save separate Terraform logs during
23+
// acceptance testing. This value sets TF_LOG_PATH in a safe manner when
24+
// executing Terraform CLI commands, which would otherwise be ignored since
25+
// it could interfere with how the underlying execution is performed.
26+
//
27+
// Takes precedence over TF_ACC_LOG_PATH.
28+
EnvTfLogPathMask = "TF_LOG_PATH_MASK"
29+
1930
// Environment variable with acceptance testing Terraform CLI version to
2031
// download from releases.hashicorp.com, checksum verify, and install. The
2132
// value can be any valid Terraform CLI version, such as 1.1.6, with or

internal/plugintest/guard.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type TestControl interface {
1919
Log(args ...interface{})
2020
FailNow()
2121
SkipNow()
22+
Name() string
2223
}
2324

2425
// testingT wraps a TestControl to recover some of the convenience behaviors

internal/plugintest/helper.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package plugintest
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"io/ioutil"
78
"os"
9+
"strings"
810

911
"github.com/hashicorp/terraform-exec/tfexec"
1012
"github.com/hashicorp/terraform-plugin-sdk/v2/internal/logging"
@@ -102,7 +104,7 @@ func (h *Helper) Close() error {
102104
// If the working directory object is not itself closed by the time the test
103105
// program exits, the Close method on the helper itself will attempt to
104106
// delete it.
105-
func (h *Helper) NewWorkingDir(ctx context.Context) (*WorkingDir, error) {
107+
func (h *Helper) NewWorkingDir(ctx context.Context, t TestControl) (*WorkingDir, error) {
106108
dir, err := ioutil.TempDir(h.baseDir, "work")
107109
if err != nil {
108110
return nil, err
@@ -124,6 +126,48 @@ func (h *Helper) NewWorkingDir(ctx context.Context) (*WorkingDir, error) {
124126
return nil, fmt.Errorf("unable to create terraform-exec instance: %w", err)
125127
}
126128

129+
err = tf.SetDisablePluginTLS(true)
130+
131+
if err != nil {
132+
return nil, fmt.Errorf("unable to disable terraform-exec plugin TLS: %w", err)
133+
}
134+
135+
err = tf.SetSkipProviderVerify(true) // Only required for Terraform CLI 0.12.x
136+
137+
var mismatch *tfexec.ErrVersionMismatch
138+
if err != nil && !errors.As(err, &mismatch) {
139+
return nil, fmt.Errorf("unable to disable terraform-exec provider verification: %w", err)
140+
}
141+
142+
var logPath, logPathEnvVar string
143+
144+
if tfAccLogPath := os.Getenv(EnvTfAccLogPath); tfAccLogPath != "" {
145+
logPath = tfAccLogPath
146+
logPathEnvVar = EnvTfAccLogPath
147+
}
148+
149+
// Similar to helper/logging.LogOutput() and
150+
// terraform-plugin-log/tfsdklog.RegisterTestSink(), the TF_LOG_PATH_MASK
151+
// environment variable should take precedence over TF_ACC_LOG_PATH.
152+
if tfLogPathMask := os.Getenv(EnvTfLogPathMask); tfLogPathMask != "" {
153+
// Escape special characters which may appear if we have subtests
154+
testName := strings.Replace(t.Name(), "/", "__", -1)
155+
logPath = fmt.Sprintf(tfLogPathMask, testName)
156+
logPathEnvVar = EnvTfLogPathMask
157+
}
158+
159+
if logPath != "" {
160+
logging.HelperResourceTrace(
161+
ctx,
162+
fmt.Sprintf("Setting terraform-exec log path via %s environment variable", logPathEnvVar),
163+
map[string]interface{}{logging.KeyTestTerraformLogPath: logPath},
164+
)
165+
166+
if err := tf.SetLogPath(logPath); err != nil {
167+
return nil, fmt.Errorf("unable to set terraform-exec log path (%s): %w", logPath, err)
168+
}
169+
}
170+
127171
return &WorkingDir{
128172
h: h,
129173
tf: tf,
@@ -138,7 +182,7 @@ func (h *Helper) NewWorkingDir(ctx context.Context) (*WorkingDir, error) {
138182
func (h *Helper) RequireNewWorkingDir(ctx context.Context, t TestControl) *WorkingDir {
139183
t.Helper()
140184

141-
wd, err := h.NewWorkingDir(ctx)
185+
wd, err := h.NewWorkingDir(ctx, t)
142186
if err != nil {
143187
t := testingT{t}
144188
t.Fatalf("failed to create new working directory: %s", err)

internal/plugintest/working_dir.go

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"context"
66
"encoding/json"
7-
"errors"
87
"fmt"
98
"io/ioutil"
109
"os"
@@ -91,22 +90,6 @@ func (wd *WorkingDir) SetConfig(ctx context.Context, cfg string) error {
9190
}
9291
wd.configFilename = outFilename
9392

94-
var mismatch *tfexec.ErrVersionMismatch
95-
err = wd.tf.SetDisablePluginTLS(true)
96-
if err != nil && !errors.As(err, &mismatch) {
97-
return err
98-
}
99-
err = wd.tf.SetSkipProviderVerify(true)
100-
if err != nil && !errors.As(err, &mismatch) {
101-
return err
102-
}
103-
104-
if p := os.Getenv(EnvTfAccLogPath); p != "" {
105-
if err := wd.tf.SetLogPath(p); err != nil {
106-
return fmt.Errorf("unable to set log path: %w", err)
107-
}
108-
}
109-
11093
// Changing configuration invalidates any saved plan.
11194
err = wd.ClearPlan(ctx)
11295
if err != nil {

0 commit comments

Comments
 (0)
0