Terraform
Validate Configuration
Ephemeral resources support validating an entire practitioner configuration in either declarative or imperative logic. Feedback, such as required syntax or acceptable combinations of values, is returned via diagnostics.
This page describes implementation details for validating entire ephemeral resource configurations, typically referencing multiple attributes. Further documentation is available for other configuration validation concepts:
- Single attribute validation is a schema-based mechanism for implementing attribute-specific validation logic.
- Type validation is a schema-based mechanism for implementing reusable validation logic for any attribute using the type.
Configuration validation in Terraform occurs without provider configuration ("offline"), therefore the ephemeral resource Configure
method will not have been called. To implement validation with a configured API client, use logic within the Open
method, which occurs during Terraform's planning phase when possible.
ConfigValidators Method
The ephemeral.EphemeralResourceWithConfigValidators
interface follows a similar pattern to attribute validation and allows for a more declarative approach. This enables consistent validation logic across multiple ephemeral resources. Each validator intended for this interface must implement the ephemeral.ConfigValidator
interface.
During execution of the terraform validate
, terraform plan
and terraform apply
commands, Terraform calls the provider ValidateEphemeralResourceConfig
RPC, in which the framework calls the ConfigValidators
method on ephemeral resources that implement the ephemeral.EphemeralResourceWithConfigValidators
interface.
The terraform-plugin-framework-validators
Go module has a collection of common use case ephemeral resource configuration validators in the ephemeralvalidator
package. These use path expressions for matching attributes.
This example will raise an error if a practitioner attempts to configure both attribute_one
and attribute_two
:
// Other methods to implement the ephemeral.EphemeralResource interface are omitted for brevity
type ThingEphemeralResource struct {}
func (d ThingEphemeralResource) ConfigValidators(ctx context.Context) []ephemeral.ConfigValidator {
return []ephemeral.ConfigValidator{
ephemeralvalidator.Conflicting(
path.MatchRoot("attribute_one"),
path.MatchRoot("attribute_two"),
),
}
}
ValidateConfig Method
The ephemeral.EphemeralResourceWithValidateConfig
interface is more imperative in design and is useful for validating unique functionality across multiple attributes that typically applies to a single ephemeral resource.
During execution of the terraform validate
, terraform plan
and terraform apply
commands, Terraform calls the provider ValidateEphemeralResourceConfig
RPC, in which the framework calls the ValidateConfig
method on providers that implement the ephemeral.EphemeralResourceWithValidateConfig
interface.
This example will raise a warning if a practitioner attempts to configure attribute_one
, but not attribute_two
:
// Other methods to implement the ephemeral.EphemeralResource interface are omitted for brevity
type ThingEphemeralResource struct {}
type ThingEphemeralResourceModel struct {
AttributeOne types.String `tfsdk:"attribute_one"`
AttributeTwo types.String `tfsdk:"attribute_two"`
}
func (d ThingEphemeralResource) ValidateConfig(ctx context.Context, req ephemeral.ValidateConfigRequest, resp *ephemeral.ValidateConfigResponse) {
var data ThingEphemeralResourceModel
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
if resp.Diagnostics.HasError() {
return
}
// If attribute_one is not configured, return without warning.
if data.AttributeOne.IsNull() || data.AttributeOne.IsUnknown() {
return
}
// If attribute_two is not null, return without warning.
if !data.AttributeTwo.IsNull() {
return
}
resp.Diagnostics.AddAttributeWarning(
path.Root("attribute_two"),
"Missing Attribute Configuration",
"Expected attribute_two to be configured with attribute_one. "+
"The ephemeral resource may return unexpected results.",
)
}