diff --git a/terraform/terraform.go b/terraform/terraform.go index 82238b2a6..468d2866e 100644 --- a/terraform/terraform.go +++ b/terraform/terraform.go @@ -21,11 +21,10 @@ type Terraform struct { // terraformProvider contains internal state information about a resource // provider for Terraform. type terraformProvider struct { - Provider ResourceProvider - Config *config.ProviderConfig - Configured bool + Provider ResourceProvider + Config *config.ProviderConfig - sync.Mutex + sync.Once } // Config is the configuration that must be given to instantiate @@ -134,7 +133,8 @@ func (t *Terraform) diffWalkFn( panic(fmt.Sprintf("No provider for resource: %s", r.Id())) } - // TODO(mitchellh): initialize provider if we haven't + // Initialize the provider if we haven't already + p.init(vars) l.RLock() var rs *ResourceState @@ -172,3 +172,18 @@ func (t *Terraform) diffWalkFn( return nil } } + +func (t *terraformProvider) init(vars map[string]string) error { + var err error + + t.Once.Do(func() { + var c map[string]interface{} + if t.Config != nil { + c = t.Config.ReplaceVariables(vars).Config + } + + _, err = t.Provider.Configure(c) + }) + + return err +} diff --git a/terraform/terraform_test.go b/terraform/terraform_test.go index 44173cfdf..c429292e9 100644 --- a/terraform/terraform_test.go +++ b/terraform/terraform_test.go @@ -221,6 +221,26 @@ func TestTerraformDiff_computed(t *testing.T) { } } +func TestTerraformDiff_providerInit(t *testing.T) { + tf := testTerraform(t, "diff-provider-init") + + _, err := tf.Diff(nil) + if err != nil { + t.Fatalf("err: %s", err) + } + + p := testProviderMock(testProvider(tf, "do_droplet.bar")) + if p == nil { + t.Fatal("should have provider") + } + if !p.ConfigureCalled { + t.Fatal("configure should be called") + } + if p.ConfigureConfig["foo"].(string) != "2" { + t.Fatalf("bad: %#v", p.ConfigureConfig) + } +} + func testConfig(t *testing.T, name string) *config.Config { c, err := config.Load(filepath.Join(fixtureDir, name, "main.tf")) if err != nil { diff --git a/terraform/test-fixtures/diff-provider-init/main.tf b/terraform/test-fixtures/diff-provider-init/main.tf new file mode 100644 index 000000000..baa619eb7 --- /dev/null +++ b/terraform/test-fixtures/diff-provider-init/main.tf @@ -0,0 +1,9 @@ +provider "do" { + foo = "${aws_instance.foo.num}" +} + +resource "aws_instance" "foo" { + num = "2" +} + +resource "do_droplet" "bar" {}