diff --git a/command/init_test.go b/command/init_test.go index ebfa397f1..ef192b7e5 100644 --- a/command/init_test.go +++ b/command/init_test.go @@ -645,6 +645,49 @@ func TestInit_findVendoredProviders(t *testing.T) { } } +// make sure we can locate providers defined in the legacy rc file +func TestInit_rcProviders(t *testing.T) { + // Create a temporary working directory that is empty + td := tempDir(t) + + configDirName := "init-legacy-rc" + copy.CopyDir(testFixturePath(configDirName), filepath.Join(td, configDirName)) + defer os.RemoveAll(td) + defer testChdir(t, td)() + + pluginDir := filepath.Join(td, "custom") + pluginPath := filepath.Join(pluginDir, "terraform-provider-legacy") + + ui := new(cli.MockUi) + m := Meta{ + Ui: ui, + PluginOverrides: &PluginOverrides{ + Providers: map[string]string{ + "legacy": pluginPath, + }, + }, + } + + c := &InitCommand{ + Meta: m, + providerInstaller: &mockProviderInstaller{}, + } + + // make our plugin paths + if err := os.MkdirAll(pluginDir, 0755); err != nil { + t.Fatal(err) + } + + if err := ioutil.WriteFile(pluginPath, []byte("test bin"), 0755); err != nil { + t.Fatal(err) + } + + args := []string{configDirName} + if code := c.Run(args); code != 0 { + t.Fatalf("bad: \n%s", ui.ErrorWriter.String()) + } +} + func TestInit_getUpgradePlugins(t *testing.T) { // Create a temporary working directory that is empty td := tempDir(t) diff --git a/command/plugins.go b/command/plugins.go index ca94f07b9..ce26b0f85 100644 --- a/command/plugins.go +++ b/command/plugins.go @@ -172,6 +172,12 @@ func (m *Meta) pluginDirs(includeAutoInstalled bool) []string { // the defined search paths. func (m *Meta) providerPluginSet() discovery.PluginMetaSet { plugins := discovery.FindPlugins("provider", m.pluginDirs(true)) + + // Add providers defined in the legacy .terraformrc, + if m.PluginOverrides != nil { + plugins = plugins.OverridePaths(m.PluginOverrides.Providers) + } + plugins, _ = plugins.ValidateVersions() for p := range plugins { @@ -198,6 +204,12 @@ func (m *Meta) providerPluginAutoInstalledSet() discovery.PluginMetaSet { // in all locations *except* the auto-install directory. func (m *Meta) providerPluginManuallyInstalledSet() discovery.PluginMetaSet { plugins := discovery.FindPlugins("provider", m.pluginDirs(false)) + + // Add providers defined in the legacy .terraformrc, + if m.PluginOverrides != nil { + plugins = plugins.OverridePaths(m.PluginOverrides.Providers) + } + plugins, _ = plugins.ValidateVersions() for p := range plugins { diff --git a/command/test-fixtures/init-legacy-rc/main.tf b/command/test-fixtures/init-legacy-rc/main.tf new file mode 100644 index 000000000..4b04a89e4 --- /dev/null +++ b/command/test-fixtures/init-legacy-rc/main.tf @@ -0,0 +1 @@ +provider "legacy" {} diff --git a/plugins.go b/plugins.go index bf2397806..cf2d54253 100644 --- a/plugins.go +++ b/plugins.go @@ -1,8 +1,10 @@ package main import ( + "fmt" "log" "path/filepath" + "runtime" ) // globalPluginDirs returns directories that should be searched for @@ -18,7 +20,9 @@ func globalPluginDirs() []string { if err != nil { log.Printf("[ERROR] Error finding global config directory: %s", err) } else { + machineDir := fmt.Sprintf("%s_%s", runtime.GOOS, runtime.GOARCH) ret = append(ret, filepath.Join(dir, "plugins")) + ret = append(ret, filepath.Join(dir, "plugins", machineDir)) } return ret