opentofu/terraform/eval_validate.go

128 lines
2.7 KiB
Go
Raw Normal View History

2015-02-04 17:44:23 -06:00
package terraform
2015-02-08 19:20:46 -06:00
import (
"fmt"
"github.com/hashicorp/terraform/config"
)
2015-02-04 17:44:23 -06:00
// EvalValidateError is the error structure returned if there were
// validation errors.
type EvalValidateError struct {
Warnings []string
Errors []error
}
func (e *EvalValidateError) Error() string {
return ""
}
2015-02-08 19:20:46 -06:00
// EvalValidateCount is an EvalNode implementation that validates
// the count of a resource.
type EvalValidateCount struct {
Resource *config.Resource
}
func (n *EvalValidateCount) Args() ([]EvalNode, []EvalType) {
return nil, nil
}
// TODO: test
func (n *EvalValidateCount) Eval(
ctx EvalContext, args []interface{}) (interface{}, error) {
var count int
var errs []error
var err error
if _, err := ctx.Interpolate(n.Resource.RawCount, nil); err != nil {
errs = append(errs, fmt.Errorf(
"Failed to interpolate count: %s", err))
goto RETURN
}
count, err = n.Resource.Count()
if err != nil {
errs = append(errs)
goto RETURN
}
if count < 0 {
errs = append(errs, fmt.Errorf(
"Count is less than zero: %d", count))
}
RETURN:
return nil, &EvalValidateError{
Errors: errs,
}
}
func (n *EvalValidateCount) Type() EvalType {
return EvalTypeNull
}
2015-02-04 19:23:26 -06:00
// EvalValidateProvider is an EvalNode implementation that validates
// the configuration of a resource.
type EvalValidateProvider struct {
Provider EvalNode
Config EvalNode
}
func (n *EvalValidateProvider) Args() ([]EvalNode, []EvalType) {
return []EvalNode{n.Provider, n.Config},
[]EvalType{EvalTypeResourceProvider, EvalTypeConfig}
}
func (n *EvalValidateProvider) Eval(
ctx EvalContext, args []interface{}) (interface{}, error) {
provider := args[0].(ResourceProvider)
config := args[1].(*ResourceConfig)
warns, errs := provider.Validate(config)
if len(warns) == 0 && len(errs) == 0 {
return nil, nil
}
return nil, &EvalValidateError{
Warnings: warns,
Errors: errs,
}
}
func (n *EvalValidateProvider) Type() EvalType {
return EvalTypeNull
}
2015-02-04 17:44:23 -06:00
// EvalValidateResource is an EvalNode implementation that validates
// the configuration of a resource.
type EvalValidateResource struct {
2015-02-04 19:02:18 -06:00
Provider EvalNode
2015-02-04 19:23:26 -06:00
Config EvalNode
ResourceType string
2015-02-04 17:44:23 -06:00
}
func (n *EvalValidateResource) Args() ([]EvalNode, []EvalType) {
2015-02-04 19:23:26 -06:00
return []EvalNode{n.Provider, n.Config},
[]EvalType{EvalTypeResourceProvider, EvalTypeConfig}
2015-02-04 17:44:23 -06:00
}
func (n *EvalValidateResource) Eval(
ctx EvalContext, args []interface{}) (interface{}, error) {
2015-02-04 19:02:18 -06:00
// TODO: test
provider := args[0].(ResourceProvider)
config := args[1].(*ResourceConfig)
warns, errs := provider.ValidateResource(n.ResourceType, config)
if len(warns) == 0 && len(errs) == 0 {
return nil, nil
}
return nil, &EvalValidateError{
Warnings: warns,
Errors: errs,
}
2015-02-04 17:44:23 -06:00
}
func (n *EvalValidateResource) Type() EvalType {
return EvalTypeNull
}