github.com/jnehlt/terraform@v0.11.12-beta1/terraform/version_required.go (about) 1 package terraform 2 3 import ( 4 "fmt" 5 6 "github.com/hashicorp/go-version" 7 "github.com/hashicorp/terraform/config" 8 "github.com/hashicorp/terraform/config/module" 9 10 tfversion "github.com/hashicorp/terraform/version" 11 ) 12 13 // CheckRequiredVersion verifies that any version requirements specified by 14 // the configuration are met. 15 // 16 // This checks the root module as well as any additional version requirements 17 // from child modules. 18 // 19 // This is tested in context_test.go. 20 func CheckRequiredVersion(m *module.Tree) error { 21 // Check any children 22 for _, c := range m.Children() { 23 if err := CheckRequiredVersion(c); err != nil { 24 return err 25 } 26 } 27 28 var tf *config.Terraform 29 if c := m.Config(); c != nil { 30 tf = c.Terraform 31 } 32 33 // If there is no Terraform config or the required version isn't set, 34 // we move on. 35 if tf == nil || tf.RequiredVersion == "" { 36 return nil 37 } 38 39 // Path for errors 40 module := "root" 41 if path := normalizeModulePath(m.Path()); len(path) > 1 { 42 module = modulePrefixStr(path) 43 } 44 45 // Check this version requirement of this module 46 cs, err := version.NewConstraint(tf.RequiredVersion) 47 if err != nil { 48 return fmt.Errorf( 49 "%s: terraform.required_version %q syntax error: %s", 50 module, 51 tf.RequiredVersion, err) 52 } 53 54 if !cs.Check(tfversion.SemVer) { 55 return fmt.Errorf( 56 "The currently running version of Terraform doesn't meet the\n"+ 57 "version requirements explicitly specified by the configuration.\n"+ 58 "Please use the required version or update the configuration.\n"+ 59 "Note that version requirements are usually set for a reason, so\n"+ 60 "we recommend verifying with whoever set the version requirements\n"+ 61 "prior to making any manual changes.\n\n"+ 62 " Module: %s\n"+ 63 " Required version: %s\n"+ 64 " Current version: %s", 65 module, 66 tf.RequiredVersion, 67 tfversion.SemVer) 68 } 69 70 return nil 71 }