Merge pull request #16969 from hashicorp/jbardin/reset-plugin-dir

allow init to reset -plugin-dir
This commit is contained in:
James Bardin 2018-01-08 16:51:47 -05:00 committed by GitHub
commit 61c2be3e95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 79 additions and 2 deletions

View File

@ -997,6 +997,71 @@ func TestInit_providerLockFile(t *testing.T) {
} }
} }
func TestInit_pluginDirReset(t *testing.T) {
td, err := ioutil.TempDir("", "tf")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(td)
defer testChdir(t, td)()
ui := new(cli.MockUi)
c := &InitCommand{
Meta: Meta{
testingOverrides: metaOverridesForProvider(testProvider()),
Ui: ui,
},
providerInstaller: &mockProviderInstaller{},
}
// make our vendor paths
pluginPath := []string{"a", "b", "c"}
for _, p := range pluginPath {
if err := os.MkdirAll(p, 0755); err != nil {
t.Fatal(err)
}
}
// run once and save the -plugin-dir
args := []string{"-plugin-dir", "a"}
if code := c.Run(args); code != 0 {
t.Fatalf("bad: \n%s", ui.ErrorWriter)
}
pluginDirs, err := c.loadPluginPath()
if err != nil {
t.Fatal(err)
}
if len(pluginDirs) != 1 || pluginDirs[0] != "a" {
t.Fatalf(`expected plugin dir ["a"], got %q`, pluginDirs)
}
ui = new(cli.MockUi)
c = &InitCommand{
Meta: Meta{
testingOverrides: metaOverridesForProvider(testProvider()),
Ui: ui,
},
providerInstaller: &mockProviderInstaller{},
}
// make sure we remove the plugin-dir record
args = []string{"-plugin-dir="}
if code := c.Run(args); code != 0 {
t.Fatalf("bad: \n%s", ui.ErrorWriter)
}
pluginDirs, err = c.loadPluginPath()
if err != nil {
t.Fatal(err)
}
if len(pluginDirs) != 0 {
t.Fatalf("expected no plugin dirs got %q", pluginDirs)
}
}
// Test user-supplied -plugin-dir // Test user-supplied -plugin-dir
func TestInit_pluginDirProviders(t *testing.T) { func TestInit_pluginDirProviders(t *testing.T) {
td := tempDir(t) td := tempDir(t)

View File

@ -117,6 +117,17 @@ func (m *Meta) storePluginPath(pluginPath []string) error {
return nil return nil
} }
path := filepath.Join(m.DataDir(), PluginPathFile)
// remove the plugin dir record if the path was set to an empty string
if len(pluginPath) == 1 && (pluginPath[0] == "") {
err := os.Remove(path)
if !os.IsNotExist(err) {
return err
}
return nil
}
js, err := json.MarshalIndent(pluginPath, "", " ") js, err := json.MarshalIndent(pluginPath, "", " ")
if err != nil { if err != nil {
return err return err
@ -125,7 +136,7 @@ func (m *Meta) storePluginPath(pluginPath []string) error {
// if this fails, so will WriteFile // if this fails, so will WriteFile
os.MkdirAll(m.DataDir(), 0755) os.MkdirAll(m.DataDir(), 0755)
return ioutil.WriteFile(filepath.Join(m.DataDir(), PluginPathFile), js, 0644) return ioutil.WriteFile(path, js, 0644)
} }
// Load the user-defined plugin search path into Meta.pluginPath if the file // Load the user-defined plugin search path into Meta.pluginPath if the file

View File

@ -133,7 +133,8 @@ The automatic plugin installation behavior can be overridden by extracting
the desired providers into a local directory and using the additional option the desired providers into a local directory and using the additional option
`-plugin-dir=PATH`. When this option is specified, _only_ the given directory `-plugin-dir=PATH`. When this option is specified, _only_ the given directory
is consulted, which prevents Terraform from making requests to the plugin is consulted, which prevents Terraform from making requests to the plugin
repository or looking for plugins in other local directories. repository or looking for plugins in other local directories. Passing an empty
string to `-plugin-dir` removes any previously recorded paths.
Custom plugins can be used along with automatically installed plugins by Custom plugins can be used along with automatically installed plugins by
placing them in `terraform.d/plugins/OS_ARCH/` inside the directory being placing them in `terraform.d/plugins/OS_ARCH/` inside the directory being