diff --git a/command/init.go b/command/init.go index ffecbb9a3b..f92a4b04c3 100644 --- a/command/init.go +++ b/command/init.go @@ -12,7 +12,6 @@ import ( multierror "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform/backend" "github.com/hashicorp/terraform/config" - "github.com/hashicorp/terraform/config/module" "github.com/hashicorp/terraform/helper/variables" "github.com/hashicorp/terraform/plugin" "github.com/hashicorp/terraform/plugin/discovery" @@ -129,9 +128,16 @@ func (c *InitCommand) Run(args []string) int { ))) header = true - s := module.NewStorage("", c.Services, c.Credentials) - if err := s.GetModule(path, src); err != nil { - c.Ui.Error(fmt.Sprintf("Error copying source module: %s", err)) + instHooks := uiModuleInstallHooks{ + ShowLocalPaths: false, + Ui: c.Ui, + } + diags := c.initDirFromModule(path, src, instHooks) + if diags.HasErrors() { + // Since this may be the user's first ever interaction with Terraform, + // we'll provide some additional context in this case. + c.Ui.Error(strings.TrimSpace(errInitConfigError)) + c.showDiagnostics(diags) return 1 } } @@ -278,6 +284,10 @@ func (c *InitCommand) Run(args []string) int { // Load the complete module tree, and fetch any missing providers. // This method outputs its own Ui. func (c *InitCommand) getProviders(path string, state *terraform.State, upgrade bool) error { + // FIXME: Temporarily disabled until we can update to the new config + // loader and associated models. + return nil + mod, diags := c.Module(path) if diags.HasErrors() { c.showDiagnostics(diags) @@ -290,11 +300,14 @@ func (c *InitCommand) getProviders(path string, state *terraform.State, upgrade return err } - if err := terraform.CheckRequiredVersion(mod); err != nil { - diags = diags.Append(err) - c.showDiagnostics(diags) - return err - } + // TODO: Update for new version models + /*if versionDiags := terraform.CheckRequiredVersion(cfg); len(versionDiags) != 0 { + diags = diags.Append(versionDiags) + if versionDiags.HasErrors() { + c.showDiagnostics(diags) + return diags.Err() + } + }*/ var available discovery.PluginMetaSet if upgrade { diff --git a/terraform/version_required.go b/terraform/version_required.go index 1f43045782..ae4757949e 100644 --- a/terraform/version_required.go +++ b/terraform/version_required.go @@ -3,10 +3,9 @@ package terraform import ( "fmt" - "github.com/hashicorp/go-version" - "github.com/hashicorp/terraform/config" - "github.com/hashicorp/terraform/config/module" - + "github.com/hashicorp/hcl2/hcl" + "github.com/hashicorp/terraform/configs" + "github.com/hashicorp/terraform/tfdiags" tfversion "github.com/hashicorp/terraform/version" ) @@ -17,55 +16,30 @@ import ( // 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 +func CheckRequiredVersion(cfg *configs.Config) tfdiags.Diagnostics { + var diags tfdiags.Diagnostics + + for _, constraint := range cfg.Module.CoreVersionConstraints { + if !constraint.Required.Check(tfversion.SemVer) { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Unmet Terraform version requirement", + Detail: fmt.Sprintf(checkRequiredVersionDetailFormat, tfversion.SemVer), + Subject: &constraint.DeclRange, + }) } } - 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 + for _, child := range cfg.Children { + childDiags := CheckRequiredVersion(child) + diags = diags.Append(childDiags) } - // Path for errors - module := "root" - if path := normalizeModulePath(m.Path()); len(path) > 1 { - module = modulePrefixStr(path) - } + return diags +} - // 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) - } +const checkRequiredVersionDetailFormat = `Your current Terraform Core version %s does not meet this version constraint. - if !cs.Check(tfversion.SemVer) { - 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, - tfversion.SemVer) - } +To proceed, either switch to an allowed version or update the configuration to permit your current version. - return nil -} +Version requirements are usually set for a good reason, so check with whoever set this version constraint before adjusting it.`