limit the amount of additional remove deprecation mark calls

This commit is contained in:
Daniel Schmidt 2026-01-21 17:08:23 +01:00
parent 11e49b983a
commit 3fd7a5052f
11 changed files with 71 additions and 48 deletions

View file

@ -84,12 +84,13 @@ func (d *Deprecations) deprecationMarksToDiagnostics(deprecationMarks []marks.De
// ValidateAsConfig checks the given value for deprecation marks and returns diagnostics
// for each deprecation found, unless deprecation warnings are suppressed for the given module.
// It checks for deeply nested deprecation marks as well.
func (d *Deprecations) ValidateAsConfig(value cty.Value, schema *configschema.Block, module addrs.Module) tfdiags.Diagnostics {
func (d *Deprecations) ValidateAsConfig(value cty.Value, schema *configschema.Block, module addrs.Module) (cty.Value, tfdiags.Diagnostics) {
var diags tfdiags.Diagnostics
_, pvms := value.UnmarkDeepWithPaths()
unmarked, pvms := value.UnmarkDeepWithPaths()
if len(pvms) == 0 || d.IsModuleCallDeprecationSuppressed(module) {
return diags
if d.IsModuleCallDeprecationSuppressed(module) {
// Even if we don't want to get deprecation warnings we want to remove the marks
return unmarked.MarkWithPaths(marks.RemoveAll(pvms, marks.Deprecation)), diags
}
for _, pvm := range pvms {
@ -118,7 +119,8 @@ func (d *Deprecations) ValidateAsConfig(value cty.Value, schema *configschema.Bl
}
}
}
return diags
return unmarked.MarkWithPaths(marks.RemoveAll(pvms, marks.Deprecation)), diags
}
func (d *Deprecations) IsModuleCallDeprecationSuppressed(addr addrs.Module) bool {

View file

@ -71,7 +71,8 @@ func (n *NodeActionDeclarationInstance) Execute(ctx EvalContext, _ walkOperation
valDiags := validateResourceForbiddenEphemeralValues(ctx, configVal, n.Schema.ConfigSchema)
diags = diags.Append(valDiags.InConfigBody(n.Config.Config, n.Addr.String()))
deprecationDiags := ctx.Deprecations().ValidateAsConfig(configVal, n.Schema.ConfigSchema, n.ModulePath())
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, n.Schema.ConfigSchema, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()))
if diags.HasErrors() {

View file

@ -68,8 +68,8 @@ func (n *NodeActionDeclarationPartialExpanded) Execute(ctx EvalContext, op walkO
if diags.HasErrors() {
return diags
}
deprecationDiags := ctx.Deprecations().ValidateAsConfig(configVal, n.Schema.ConfigSchema, n.ActionAddr().Module)
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, n.Schema.ConfigSchema, n.ActionAddr().Module)
diags = diags.Append(deprecationDiags)
if diags.HasErrors() {
return diags

View file

@ -101,8 +101,9 @@ func (n *NodeValidatableAction) Execute(ctx EvalContext, _ walkOperation) tfdiag
return diags
}
}
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(configVal, schema.ConfigSchema, n.ModulePath()).InConfigBody(n.Config.Config, n.Addr.String()))
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.ConfigSchema, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()))
valDiags = validateResourceForbiddenEphemeralValues(ctx, configVal, schema.ConfigSchema)
diags = diags.Append(valDiags.InConfigBody(config, n.Addr.String()))

View file

@ -83,7 +83,8 @@ func (n *NodeApplyableProvider) ValidateProvider(ctx EvalContext, provider provi
return diags
}
deprecationDiags := ctx.Deprecations().ValidateAsConfig(configVal, configSchema, n.Addr.Module)
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, configSchema, n.Addr.Module)
diags = diags.Append(deprecationDiags.InConfigBody(configBody, n.Addr.String()))
if diags.HasErrors() {
return diags

View file

@ -869,7 +869,9 @@ func (n *NodeAbstractResourceInstance) plan(
diags = diags.Append(
validateResourceForbiddenEphemeralValues(ctx, origConfigVal, schema.Body).InConfigBody(n.Config.Config, n.Addr.String()),
)
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(origConfigVal, schema.Body, n.ModulePath()).InConfigBody(n.Config.Config, n.Addr.String()))
var deprecationDiags tfdiags.Diagnostics
origConfigVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(origConfigVal, schema.Body, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()))
if diags.HasErrors() {
return nil, nil, deferred, keyData, diags
}
@ -1787,10 +1789,9 @@ func (n *NodeAbstractResourceInstance) providerMetas(ctx EvalContext) (cty.Value
var configDiags tfdiags.Diagnostics
metaConfigVal, _, configDiags = ctx.EvaluateBlock(m.Config, providerSchema.ProviderMeta.Body, nil, EvalDataForNoInstanceKey)
diags = diags.Append(configDiags)
diags = diags.Append(
ctx.Deprecations().ValidateAsConfig(metaConfigVal, providerSchema.ProviderMeta.Body, ctx.Path().Module()).InConfigBody(m.Config, n.Addr.String()),
)
metaConfigVal = marks.RemoveDeprecationMarks(metaConfigVal)
var deprecationDiags tfdiags.Diagnostics
metaConfigVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(metaConfigVal, providerSchema.ProviderMeta.Body, ctx.Path().Module())
diags = diags.Append(deprecationDiags.InConfigBody(m.Config, n.Addr.String()))
}
}
}
@ -1867,10 +1868,11 @@ func (n *NodeAbstractResourceInstance) planDataSource(ctx EvalContext, checkRule
diags = diags.Append(
validateResourceForbiddenEphemeralValues(ctx, configVal, schema.Body).InConfigBody(n.Config.Config, n.Addr.String()),
)
diags = diags.Append(
ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, ctx.Path().Module()).InConfigBody(n.Config.Config, n.Addr.String()),
)
configVal = marks.RemoveDeprecationMarks(configVal)
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, ctx.Path().Module())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()))
if diags.HasErrors() {
return nil, nil, deferred, keyData, diags
}
@ -2208,13 +2210,13 @@ func (n *NodeAbstractResourceInstance) applyDataSource(ctx EvalContext, planned
return nil, keyData, diags
}
diags = diags.Append(
ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath()).InConfigBody(n.Config.Config, n.Addr.String()),
)
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()))
if diags.HasErrors() {
return nil, keyData, diags
}
configVal = marks.RemoveDeprecationMarks(configVal)
newVal, readDeferred, readDiags := n.readDataSource(ctx, configVal)
if check, nested := n.nestedInCheckBlock(); nested {
@ -2527,8 +2529,9 @@ func (n *NodeAbstractResourceInstance) evalProvisionerConfig(ctx EvalContext, bo
config, _, configDiags := ctx.EvaluateBlock(body, schema, n.ResourceInstanceAddr().Resource, keyData)
diags = diags.Append(configDiags)
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(config, schema, n.ModulePath()).InConfigBody(body, n.Addr.String()))
config = marks.RemoveDeprecationMarks(config)
var deprecationDiags tfdiags.Diagnostics
config, deprecationDiags = ctx.Deprecations().ValidateAsConfig(config, schema, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(body, n.Addr.String()))
return config, diags
}
@ -2546,8 +2549,9 @@ func (n *NodeAbstractResourceInstance) evalDestroyProvisionerConfig(ctx EvalCont
evalScope := ctx.EvaluationScope(n.ResourceInstanceAddr().Resource, nil, keyData)
config, evalDiags := evalScope.EvalSelfBlock(body, self, schema, keyData)
diags = diags.Append(evalDiags)
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(config, schema, n.ModulePath()).InConfigBody(body, n.Addr.String()))
config = marks.RemoveDeprecationMarks(config)
var deprecationDiags tfdiags.Diagnostics
config, deprecationDiags = ctx.Deprecations().ValidateAsConfig(config, schema, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(body, n.Addr.String()))
return config, diags
}

View file

@ -76,7 +76,9 @@ func ephemeralResourceOpen(ctx EvalContext, inp ephemeralResourceInput) (*provid
if diags.HasErrors() {
return nil, diags
}
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, ctx.Path().Module()).InConfigBody(config.Config, inp.addr.String()))
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, ctx.Path().Module())
diags = diags.Append(deprecationDiags.InConfigBody(config.Config, inp.addr.String()))
if diags.HasErrors() {
return nil, diags
}

View file

@ -662,7 +662,9 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs.
diags = diags.Append(configDiags)
return nil, deferred, diags
}
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath()).InConfigBody(n.Config.Config, absAddr.String()))
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, absAddr.String()))
if diags.HasErrors() {
return nil, deferred, diags
}

View file

@ -8,7 +8,6 @@ import (
"log"
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/lang/marks"
"github.com/hashicorp/terraform/internal/plans"
"github.com/hashicorp/terraform/internal/providers"
"github.com/hashicorp/terraform/internal/tfdiags"
@ -50,8 +49,9 @@ func (n *NodePlannableResourceInstance) listResourceExecute(ctx EvalContext) (di
if diags.HasErrors() {
return diags
}
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(blockVal, schema.FullSchema, n.ModulePath()).InConfigBody(config.Config, n.Addr.String()))
var deprecationDiags tfdiags.Diagnostics
blockVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(blockVal, schema.FullSchema, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(config.Config, n.Addr.String()))
if diags.HasErrors() {
return diags
}
@ -74,7 +74,6 @@ func (n *NodePlannableResourceInstance) listResourceExecute(ctx EvalContext) (di
var limitDeprecationDiags tfdiags.Diagnostics
limitCty, limitDeprecationDiags = ctx.Deprecations().Validate(limitCty, ctx.Path().Module(), config.List.Limit.Range().Ptr())
diags = diags.Append(limitDeprecationDiags)
limitCty = marks.RemoveDeprecationMarks(limitCty)
}
includeRscCty, includeRsc, includeDiags := newIncludeRscEvaluator(false).EvaluateExpr(ctx, config.List.IncludeResource)
@ -87,7 +86,6 @@ func (n *NodePlannableResourceInstance) listResourceExecute(ctx EvalContext) (di
var includeDeprecationDiags tfdiags.Diagnostics
includeRscCty, includeDeprecationDiags = ctx.Deprecations().Validate(includeRscCty, ctx.Path().Module(), config.List.IncludeResource.Range().Ptr())
diags = diags.Append(includeDeprecationDiags)
includeRscCty = marks.RemoveDeprecationMarks(includeRscCty)
}
rId := HookResourceIdentity{

View file

@ -200,7 +200,9 @@ func (n *nodePlannablePartialExpandedResource) managedResourceExecute(ctx EvalCo
return &change, diags
}
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ResourceAddr().Module).InConfigBody(n.config.Config, n.addr.String()))
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ResourceAddr().Module)
diags = diags.Append(deprecationDiags.InConfigBody(n.config.Config, n.addr.String()))
if diags.HasErrors() {
return &change, diags
}
@ -359,7 +361,9 @@ func (n *nodePlannablePartialExpandedResource) dataResourceExecute(ctx EvalConte
return &change, diags
}
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ResourceAddr().Module).InConfigBody(n.config.Config, n.addr.String()))
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ResourceAddr().Module)
diags = diags.Append(deprecationDiags.InConfigBody(n.config.Config, n.addr.String()))
if diags.HasErrors() {
return &change, diags
}

View file

@ -19,7 +19,6 @@ import (
"github.com/hashicorp/terraform/internal/lang/ephemeral"
"github.com/hashicorp/terraform/internal/lang/format"
"github.com/hashicorp/terraform/internal/lang/langrefs"
"github.com/hashicorp/terraform/internal/lang/marks"
"github.com/hashicorp/terraform/internal/providers"
"github.com/hashicorp/terraform/internal/provisioners"
"github.com/hashicorp/terraform/internal/tfdiags"
@ -144,9 +143,11 @@ func (n *NodeValidatableResource) evaluateBlock(ctx EvalContext, body hcl.Body,
keyData, selfAddr := n.stubRepetitionData(n.Config.Count != nil, n.Config.ForEach != nil)
val, hclBody, diags := ctx.EvaluateBlock(body, schema, selfAddr, keyData)
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(val, schema, n.Addr.Module).InConfigBody(body, n.Addr.String()))
return marks.RemoveDeprecationMarks(val), hclBody, diags
var deprecationDiags tfdiags.Diagnostics
val, deprecationDiags = ctx.Deprecations().ValidateAsConfig(val, schema, n.Addr.Module)
diags = diags.Append(deprecationDiags.InConfigBody(body, n.Addr.String()))
return val, hclBody, diags
}
// connectionBlockSupersetSchema is a schema representing the superset of all
@ -360,7 +361,9 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag
diags = diags.Append(
validateResourceForbiddenEphemeralValues(ctx, configVal, schema.Body).InConfigBody(n.Config.Config, n.Addr.String()),
)
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath()).InConfigBody(n.Config.Config, n.Addr.String()))
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()))
if n.Config.Managed != nil { // can be nil only in tests with poorly-configured mocks
for _, traversal := range n.Config.Managed.IgnoreChanges {
@ -440,7 +443,9 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag
diags = diags.Append(
validateResourceForbiddenEphemeralValues(ctx, configVal, schema.Body).InConfigBody(n.Config.Config, n.Addr.String()),
)
diags = diags.Append(ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath()))
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()))
// Use unmarked value for validate request
unmarkedConfigVal, _ := configVal.UnmarkDeep()
@ -468,8 +473,10 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag
if valDiags.HasErrors() {
return diags
}
var deprecationDiags tfdiags.Diagnostics
configVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath())
diags = diags.Append(
ctx.Deprecations().ValidateAsConfig(configVal, schema.Body, n.ModulePath()).InConfigBody(n.Config.Config, n.Addr.String()),
deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()),
)
// Use unmarked value for validate request
unmarkedConfigVal, _ := configVal.UnmarkDeep()
@ -502,7 +509,8 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag
if valDiags.HasErrors() {
return diags
}
deprecationDiags := ctx.Deprecations().ValidateAsConfig(blockVal, schema.FullSchema, n.ModulePath())
var deprecationDiags tfdiags.Diagnostics
blockVal, deprecationDiags = ctx.Deprecations().ValidateAsConfig(blockVal, schema.FullSchema, n.ModulePath())
diags = diags.Append(deprecationDiags.InConfigBody(n.Config.Config, n.Addr.String()))
}
@ -513,9 +521,9 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag
if limitDiags.HasErrors() {
return diags
}
_, deprecationDiags := ctx.Deprecations().Validate(limit, n.ModulePath(), n.Config.List.Limit.Range().Ptr())
var deprecationDiags tfdiags.Diagnostics
limit, deprecationDiags = ctx.Deprecations().Validate(limit, n.ModulePath(), n.Config.List.Limit.Range().Ptr())
diags = diags.Append(deprecationDiags)
limit = marks.RemoveDeprecationMarks(limit)
}
if n.Config.List.IncludeResource != nil {
@ -524,9 +532,9 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag
if includeDiags.HasErrors() {
return diags
}
_, deprecationDiags := ctx.Deprecations().Validate(includeResource, n.ModulePath(), n.Config.List.IncludeResource.Range().Ptr())
var deprecationDiags tfdiags.Diagnostics
includeResource, deprecationDiags = ctx.Deprecations().Validate(includeResource, n.ModulePath(), n.Config.List.IncludeResource.Range().Ptr())
diags = diags.Append(deprecationDiags)
includeResource = marks.RemoveDeprecationMarks(includeResource)
}
// Use unmarked value for validate request