70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
package terraform
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/go-version"
|
|
"github.com/hashicorp/terraform/config"
|
|
"github.com/hashicorp/terraform/config/module"
|
|
)
|
|
|
|
// checkRequiredVersion verifies that any version requirements specified by
|
|
// the configuration are met.
|
|
//
|
|
// This checks the root module as well as any additional version requirements
|
|
// from child modules.
|
|
//
|
|
// This is tested in context_test.go.
|
|
func checkRequiredVersion(m *module.Tree) error {
|
|
// Check any children
|
|
for _, c := range m.Children() {
|
|
if err := checkRequiredVersion(c); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
var tf *config.Terraform
|
|
if c := m.Config(); c != nil {
|
|
tf = c.Terraform
|
|
}
|
|
|
|
// If there is no Terraform config or the required version isn't set,
|
|
// we move on.
|
|
if tf == nil || tf.RequiredVersion == "" {
|
|
return nil
|
|
}
|
|
|
|
// Path for errors
|
|
module := "root"
|
|
if path := normalizeModulePath(m.Path()); len(path) > 1 {
|
|
module = modulePrefixStr(path)
|
|
}
|
|
|
|
// Check this version requirement of this module
|
|
cs, err := version.NewConstraint(tf.RequiredVersion)
|
|
if err != nil {
|
|
return fmt.Errorf(
|
|
"%s: terraform.required_version %q syntax error: %s",
|
|
module,
|
|
tf.RequiredVersion, err)
|
|
}
|
|
|
|
if !cs.Check(SemVersion) {
|
|
return fmt.Errorf(
|
|
"The currently running version of Terraform doesn't meet the\n"+
|
|
"version requirements explicitly specified by the configuration.\n"+
|
|
"Please use the required version or update the configuration.\n"+
|
|
"Note that version requirements are usually set for a reason, so\n"+
|
|
"we recommend verifying with whoever set the version requirements\n"+
|
|
"prior to making any manual changes.\n\n"+
|
|
" Module: %s\n"+
|
|
" Required version: %s\n"+
|
|
" Current version: %s",
|
|
module,
|
|
tf.RequiredVersion,
|
|
SemVersion)
|
|
}
|
|
|
|
return nil
|
|
}
|