Terraform
- Plugin Framework
- v1.16.x (latest)
- No versions of this document exist before v1.15.x. Click below to redirect to the version homepage.
- v1.15.x
- v1.14.x
- v1.13.x
- v1.12.x
- v1.11.x
- v1.10.x
- v1.9.x
- v1.8.x
- v1.7.x
- v1.5.x
- v1.4.x
- v1.3.x
- v1.2.x
- v1.1.x
- v1.0.x
- v0.17.x
- v0.16.x
- v0.15.x
- v0.14.x
- v0.13.x
- v0.12.x
- v0.11.x
- v0.10.x
- v0.9.x
- v0.8.x
- v0.7.x
Validators - Predefined
Attribute validators ensure that attributes do or do not contain specific values. You can use predefined validators for many use cases, or implement custom validators. Refer to Schemas - Validators in the Framework documentation for details. Refer to the Attributes - Custom Validators page in this guide to learn how to implement custom validators.
The following table describes the mapping between predefined validators in SDKv2 and the Framework. You should use an attribute validator for per-attribute validation, or a data source validator, provider validator or resource validator for declaring validation at the level of the data source, provider or resource, respectively.
| SDK Attribute Field | Framework Attribute Validator | Framework Data Source Validator | Framework Provider Validator | Framework Resource Validator |
|---|---|---|---|---|
| AtLeastOneOf | {TYPE}validator.AtLeastOneOf() | datasourcevalidator.AtLeastOneOf() | providervalidator.AtLeastOneOf() | resourcevalidator.AtLeastOneOf() |
| ConflictsWith | {TYPE}validator.ConflictsWith() | datasourcevalidator.Conflicting() | providervalidator.Conflicting() | resourcevalidator.Conflicting() |
| ExactlyOneOf | {TYPE}validator.ExactlyOneOf() | datasourcevalidator.ExactlyOneOf() | providervalidator.ExactlyOneOf() | resourcevalidator.ExactlyOneOf() |
| RequiredWith | {TYPE}validator.AlsoRequires() | datasourcevalidator.RequiredTogether() | providervalidator.RequiredTogether() | resourcevalidator.RequiredTogether() |
This page explains how to migrate a predefined validator from SDKv2 to the Framework.
SDKv2
In SDKv2, the ConflictsWith, ExactlyOneOf, AtLeastOneOf, and RequiredWith fields on an attribute's
schema.Schema struct perform predefined validations on the list of attributes set for these fields.
func resourceExample() *schema.Resource {
return &schema.Resource{
/* ... */
Schema: map[string]*schema.Schema{
"attribute_example": {
ConflictsWith: []string{ /* ... */ },
ExactlyOneOf: []string{ /* ... */ },
AtLeastOneOf: []string{ /* ... */ },
RequiredWith: []string{ /* ... */ },
/* ... */
Framework
In the Framework, you implement either type of validation by setting the Validators field on the schema.Attribute
implementation. Validators that perform the same checks as the
predefined validators in SDKv2 are
available for the Framework. If the predefined
validators do not meet your needs, you must define
custom validators.
func (r *resourceExample) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
resp.Schema = schema.Schema{
/* ... */
Attributes: map[string]schema.Attribute{
"attribute_example": schema.StringAttribute{
Validators: []validator.String{
stringvalidator.ConflictsWith( /* ... */ ),
/* ... */
Configuration validators can also be defined for
providers,
resources and
data sources by
implementing ProviderWithConfigValidators, ResourceWithConfigValidators, and DataSourceWithConfigValidators
interfaces, respectively.
func (r *resourceExample) ConfigValidators(ctx context.Context) []resource.ConfigValidator {
return []resource.ConfigValidator{
resourcevalidator.Conflicting(
/* ... */
),
/* ... */
Migration Notes
Remember the following details when migrating from SDKv2 to the Framework.
- In SDKv2,
ValidateDiagFuncis a field onschema.Schemathat you can use to define validation functions. In SDKv2, there are also built-in validations. For example,ConflictsWithis a field on theschema.Schemastruct in SDKv2. In the Framework,Validatorsis a field on eachschema.Attributeimplementation. - Validators replicating the behavior of
ConflictsWith,ExactlyOneOf,AtLeastOneOf, andRequiredWithin SDKv2 are available for the Framework in each of the type-specific packages of terraform-plugin-framework-validators. - Define custom validators when the predefined validators do not meet your requirements.
Example
SDKv2
The following example shows the implementation of the ConflictsWith field on the
provider's example_block block's example_attribute_one attribute.
This validator checks that the provider does not use the example_attribute_one attribute
when the example_attribute_four is being used. The example also uses the RequiredWith field to ensure that the
example_attribute_two attribute is configured when example_attribute_one is, and that the
example_attribute_three attribute is configured when example_attribute_two is.
func New() (*schema.Provider, error) {
return &schema.Provider{
Schema: map[string]*schema.Schema{
"example_block": {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"example_attribute_one": {
ConflictsWith: []string{"example_block.0.example_attribute_four"},
/* ... */
},
"example_attribute_two": {
RequiredWith: []string{"example_block.0.example_attribute_one"},
/* ... */
},
"example_attribute_three": {
RequiredWith: []string{"example_block.0.example_attribute_two"},
/* ... */
},
"example_attribute_four": {
ConflictsWith: []string{
"example_block.0.example_attribute_one",
"example_block.0.example_attribute_two",
"example_block.0.example_attribute_three",
},
/* ... */
},
},
},
},
},
}, nil
}
Framework
The following shows the same section of provider code after the migration.
This code implements the ConflictsWith and AlsoRequires validators with the Framework. The validators are configured
via the Validators field of the provider's example_block block's attribute schema.
func (p *TlsProvider) Schema(_ context.Context, _ provider.SchemaRequest, resp *provider.SchemaResponse) {
resp.Schema = schema.Schema{
Blocks: map[string]schema.Block{
"example_block": schema.ListNestedBlock{
NestedObject: schema.NestedBlockObject{
Attributes: map[string]schema.Attribute{
"example_attribute_one": schema.StringAttribute{
Validators: []validator.String{
stringvalidator.ConflictsWith(path.MatchRelative().AtParent().AtName("example_attribute_four")),
},
/* ... */
},
"example_attribute_two": schema.StringAttribute{
Validators: []validator.String{
stringvalidator.AlsoRequires(path.MatchRelative().AtParent().AtName("example_attribute_one")),
},
/* ... */
},
"example_attribute_three": schema.StringAttribute{
Validators: []validator.String{
stringvalidator.AlsoRequires(path.MatchRelative().AtParent().AtName("example_attribute_two")),
},
/* ... */
},
"example_attribute_four": schema.BoolAttribute{
Validators: []validator.Bool{
boolvalidator.ConflictsWith(
path.MatchRelative().AtParent().AtName("example_attribute_one"),
path.MatchRelative().AtParent().AtName("example_attribute_two"),
path.MatchRelative().AtParent().AtName("example_attribute_three"),
),
},
/* ... */
},
},
},
},
}
}