From 85b9069eb75dbe5fa808fa782fc2514e3199c217 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 27 Jun 2017 11:07:45 -0400 Subject: [PATCH] test import with -plugin-dir The import command wasn't loading the full plugin path for discovery. Run a basic plugin init sequence, and verify we can find a plugin (even though the plugin is invalid and will fail). --- command/import_test.go | 71 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/command/import_test.go b/command/import_test.go index da31fe03d8..057ab560bb 100644 --- a/command/import_test.go +++ b/command/import_test.go @@ -2,9 +2,14 @@ package command import ( "fmt" + "io/ioutil" + "os" "strings" "testing" + "github.com/hashicorp/terraform/helper/copy" + "github.com/hashicorp/terraform/plugin" + "github.com/hashicorp/terraform/plugin/discovery" "github.com/hashicorp/terraform/terraform" "github.com/mitchellh/cli" ) @@ -466,6 +471,72 @@ func TestImport_targetIsModule(t *testing.T) { } } +// make sure we search the full plugin path during import +func TestImport_pluginDir(t *testing.T) { + td := tempDir(t) + copy.CopyDir(testFixturePath("import-provider"), td) + defer os.RemoveAll(td) + defer testChdir(t, td)() + + // make a fake provider in a custom plugin directory + if err := os.Mkdir("plugins", 0755); err != nil { + t.Fatal(err) + } + if err := ioutil.WriteFile("plugins/terraform-provider-test_v1.1.1_x4", []byte("invalid binary"), 0755); err != nil { + t.Fatal(err) + } + + ui := new(cli.MockUi) + c := &ImportCommand{ + Meta: Meta{ + Ui: ui, + }, + } + + // store our custom plugin path, which would normally happen during init + if err := c.storePluginPath([]string{"./plugins"}); err != nil { + t.Fatal(err) + } + + // Now we need to go through some plugin init. + // This discovers our fake plugin and writes the lock file. + initCmd := &InitCommand{ + Meta: Meta{ + pluginPath: []string{"./plugins"}, + Ui: new(cli.MockUi), + }, + providerInstaller: &discovery.ProviderInstaller{ + PluginProtocolVersion: plugin.Handshake.ProtocolVersion, + }, + } + if err := initCmd.getProviders(".", nil, false); err != nil { + t.Fatal(err) + } + + args := []string{ + "test_instance.foo", + "bar", + } + if code := c.Run(args); code == 0 { + t.Fatalf("expected error, got: %s", ui.OutputWriter) + } + + outMsg := ui.OutputWriter.String() + // if we were missing a plugin, the output will have some explanation + // about requirements. If discovery starts verifying binary compatibility, + // we will need to write a dummy provider above. + if strings.Contains(outMsg, "requirements") { + t.Fatal("unexpected output:", outMsg) + } + + // We wanted a plugin execution error, rather than a requirement error. + // Looking for "exec" in the error should suffice for now. + errMsg := ui.ErrorWriter.String() + if !strings.Contains(errMsg, "exec") { + t.Fatal("unexpected error:", errMsg) + } +} + const testImportStr = ` test_instance.foo: ID = yay