From 79a35f39688ddb1d89665c11b4e05ef0b1618fd2 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Mon, 4 Nov 2024 11:16:13 +0000 Subject: [PATCH] lang: Add Extra to avoid duplicate diagnostic in check blocks (#35944) --- internal/lang/checks.go | 11 ++++++++++- internal/moduletest/eval_context.go | 2 +- internal/terraform/eval_conditions.go | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/internal/lang/checks.go b/internal/lang/checks.go index 7c6b39818a..9ad8d91e04 100644 --- a/internal/lang/checks.go +++ b/internal/lang/checks.go @@ -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" @@ -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) @@ -73,6 +74,13 @@ 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", @@ -80,6 +88,7 @@ You can correct this by removing references to sensitive values, or by carefully 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 } diff --git a/internal/moduletest/eval_context.go b/internal/moduletest/eval_context.go index 3822d2b119..0c4583b706 100644 --- a/internal/moduletest/eval_context.go +++ b/internal/moduletest/eval_context.go @@ -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) diff --git a/internal/terraform/eval_conditions.go b/internal/terraform/eval_conditions.go index 09be10951d..6a221339e4 100644 --- a/internal/terraform/eval_conditions.go +++ b/internal/terraform/eval_conditions.go @@ -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