opentofu/terraform/eval_validate.go

148 lines
3.5 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 fmt.Sprintf("Warnings: %s. Errors: %s", e.Warnings, e.Errors)
2015-02-04 17:44:23 -06:00
}
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
}
// TODO: test
2015-02-14 00:58:41 -06:00
func (n *EvalValidateCount) Eval(ctx EvalContext) (interface{}, error) {
2015-02-08 19:20:46 -06:00
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 {
2015-02-10 14:16:55 -06:00
// If we can't get the count during validation, then
// just replace it with the number 1.
c := n.Resource.RawCount.Config()
c[n.Resource.RawCount.Key] = "1"
count = 1
2015-02-08 19:20:46 -06:00
}
if count < 0 {
errs = append(errs, fmt.Errorf(
"Count is less than zero: %d", count))
}
RETURN:
if len(errs) != 0 {
err = &EvalValidateError{
Errors: errs,
}
2015-02-08 19:20:46 -06:00
}
return nil, err
2015-02-08 19:20:46 -06:00
}
2015-02-04 19:23:26 -06:00
// EvalValidateProvider is an EvalNode implementation that validates
// the configuration of a resource.
type EvalValidateProvider struct {
Provider *ResourceProvider
Config **ResourceConfig
2015-02-04 19:23:26 -06:00
}
2015-02-14 00:58:41 -06:00
func (n *EvalValidateProvider) Eval(ctx EvalContext) (interface{}, error) {
provider := *n.Provider
config := *n.Config
2015-02-04 19:23:26 -06:00
warns, errs := provider.Validate(config)
if len(warns) == 0 && len(errs) == 0 {
return nil, nil
}
return nil, &EvalValidateError{
Warnings: warns,
Errors: errs,
}
}
2015-02-09 13:15:54 -06:00
// EvalValidateProvisioner is an EvalNode implementation that validates
// the configuration of a resource.
type EvalValidateProvisioner struct {
2015-02-14 00:58:41 -06:00
Provisioner *ResourceProvisioner
Config **ResourceConfig
2015-02-09 13:15:54 -06:00
}
2015-02-14 00:58:41 -06:00
func (n *EvalValidateProvisioner) Eval(ctx EvalContext) (interface{}, error) {
provisioner := *n.Provisioner
config := *n.Config
warns, errs := provisioner.Validate(config)
2015-02-09 13:15:54 -06:00
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
// EvalValidateResource is an EvalNode implementation that validates
// the configuration of a resource.
type EvalValidateResource struct {
2015-02-14 00:58:41 -06:00
Provider *ResourceProvider
Config **ResourceConfig
2015-02-09 11:50:20 -06:00
ResourceName string
ResourceType string
ResourceMode config.ResourceMode
2015-02-04 17:44:23 -06:00
}
2015-02-14 00:58:41 -06:00
func (n *EvalValidateResource) Eval(ctx EvalContext) (interface{}, error) {
2015-02-04 19:02:18 -06:00
// TODO: test
2015-02-14 00:58:41 -06:00
provider := *n.Provider
cfg := *n.Config
var warns []string
var errs []error
// Provider entry point varies depending on resource mode, because
// managed resources and data resources are two distinct concepts
// in the provider abstraction.
switch n.ResourceMode {
case config.ManagedResourceMode:
warns, errs = provider.ValidateResource(n.ResourceType, cfg)
case config.DataResourceMode:
warns, errs = provider.ValidateDataSource(n.ResourceType, cfg)
}
2015-02-09 11:50:20 -06:00
// If the resouce name doesn't match the name regular
// expression, show a warning.
if !config.NameRegexp.Match([]byte(n.ResourceName)) {
errs = append(errs, fmt.Errorf(
2015-02-09 11:50:20 -06:00
"%s: resource name can only contain letters, numbers, "+
"dashes, and underscores."+
n.ResourceName))
2015-02-09 11:50:20 -06:00
}
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
}