Skip to content

Commit

Permalink
Merge branch 'main' into TF-21933-document-cloud-block-tags-behavior-…
Browse files Browse the repository at this point in the history
…in-1-10
  • Loading branch information
brandonc authored Nov 4, 2024
2 parents a1d179d + 43d616f commit 600848f
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 10 deletions.
11 changes: 10 additions & 1 deletion internal/lang/checks.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"

"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/lang/marks"
"github.com/hashicorp/terraform/internal/tfdiags"
"github.com/zclconf/go-cty/cty"
Expand All @@ -21,7 +22,7 @@ import (
// It will either return a non-empty message string or it'll return diagnostics
// with either errors or warnings that explain why the given expression isn't
// acceptable.
func EvalCheckErrorMessage(expr hcl.Expression, hclCtx *hcl.EvalContext) (string, tfdiags.Diagnostics) {
func EvalCheckErrorMessage(expr hcl.Expression, hclCtx *hcl.EvalContext, ruleAddr *addrs.CheckRule) (string, tfdiags.Diagnostics) {
var diags tfdiags.Diagnostics

val, hclDiags := expr.Value(hclCtx)
Expand Down Expand Up @@ -73,13 +74,21 @@ You can correct this by removing references to sensitive values, or by carefully
}

if _, ephemeral := valMarks[marks.Ephemeral]; ephemeral {
var extra interface{}
if ruleAddr != nil {
extra = &addrs.CheckRuleDiagnosticExtra{
CheckRule: *ruleAddr,
}
}

diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagWarning,
Summary: "Error message refers to ephemeral values",
Detail: `The error expression used to explain this condition refers to ephemeral values, so Terraform will not display the resulting message.
You can correct this by removing references to ephemeral values, or by using the ephemeralasnull() function on the references to not reveal ephemeral data.`,
Subject: expr.Range().Ptr(),
Extra: extra,
})
return "", diags
}
Expand Down
2 changes: 1 addition & 1 deletion internal/moduletest/eval_context.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ func (ec *EvalContext) Evaluate() (Status, cty.Value, tfdiags.Diagnostics) {
continue
}

errorMessage, moreDiags := lang.EvalCheckErrorMessage(rule.ErrorMessage, hclCtx)
errorMessage, moreDiags := lang.EvalCheckErrorMessage(rule.ErrorMessage, hclCtx, nil)
ruleDiags = ruleDiags.Append(moreDiags)

runVal, hclDiags := rule.Condition.Value(hclCtx)
Expand Down
57 changes: 50 additions & 7 deletions internal/terraform/context_plan_ephemeral_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"fmt"
"testing"

"github.com/google/go-cmp/cmp"
"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/configs"
Expand Down Expand Up @@ -332,15 +333,18 @@ module "child" {
},

"check blocks": {
toBeImplemented: true,
module: map[string]string{
"main.tf": `
ephemeral "ephem_resource" "data" {}
check "check_using_ephemeral_value" {
assert {
condition = ephemeral.ephem_resource.data.bool
error_message = "This should not fail"
condition = ephemeral.ephem_resource.data.bool == false
error_message = "Fine to persist"
}
assert {
condition = ephemeral.ephem_resource.data.bool == false
error_message = "Shall not be persisted ${ephemeral.ephem_resource.data.bool}"
}
}
`,
Expand All @@ -350,10 +354,49 @@ check "check_using_ephemeral_value" {
expectCloseEphemeralResourceCalled: true,

assertPlan: func(t *testing.T, p *plans.Plan) {
// Checks using ephemeral values should not be included in the plan
if p.Checks.ConfigResults.Len() > 0 {
t.Fatalf("Expected no checks to be included in the plan, but got %d", p.Checks.ConfigResults.Len())
key := addrs.ConfigCheck{
Module: addrs.RootModule,
Check: addrs.Check{
Name: "check_using_ephemeral_value",
},
}
result, ok := p.Checks.ConfigResults.GetOk(key)
if !ok {
t.Fatalf("expected to find check result for %q", key)
}
objKey := addrs.AbsCheck{
Module: addrs.RootModuleInstance,
Check: addrs.Check{
Name: "check_using_ephemeral_value",
},
}
obj, ok := result.ObjectResults.GetOk(objKey)
if !ok {
t.Fatalf("expected to find object for %q", objKey)
}
expectedMessages := []string{"Fine to persist"}
if diff := cmp.Diff(expectedMessages, obj.FailureMessages); diff != "" {
t.Fatalf("unexpected messages: %s", diff)
}
},
expectPlanDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) {
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagWarning,
Summary: "Check block assertion failed",
Detail: "Fine to persist",
})
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagWarning,
Summary: "Check block assertion failed",
Detail: "This check failed, but has an invalid error message as described in the other accompanying messages.",
})
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagWarning,
Summary: "Error message refers to ephemeral values",
Detail: "The error expression used to explain this condition refers to ephemeral values, so Terraform will not display the resulting message." +
"\n\nYou can correct this by removing references to ephemeral values, or by using the ephemeralasnull() function on the references to not reveal ephemeral data.",
})
return diags
},
},

Expand Down Expand Up @@ -510,7 +553,7 @@ ephemeral "ephem_resource" "data" {
},
},
Functions: map[string]providers.FunctionDecl{
"either": providers.FunctionDecl{
"either": {
Parameters: []providers.FunctionParam{
{
Name: "a",
Expand Down
2 changes: 1 addition & 1 deletion internal/terraform/eval_conditions.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func validateCheckRule(addr addrs.CheckRule, rule *configs.CheckRule, ctx EvalCo
hclCtx, moreDiags := scope.EvalContext(refs)
diags = diags.Append(moreDiags)

errorMessage, moreDiags := lang.EvalCheckErrorMessage(rule.ErrorMessage, hclCtx)
errorMessage, moreDiags := lang.EvalCheckErrorMessage(rule.ErrorMessage, hclCtx, &addr)
diags = diags.Append(moreDiags)

return errorMessage, hclCtx, diags
Expand Down

0 comments on commit 600848f

Please sign in to comment.