From ce0867fa096e7c29efab3ecef80dca3f01597d5e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2014 00:20:23 -0700 Subject: [PATCH] terraform: call Configure on the provider --- terraform/terraform.go | 25 +++++++++++++++---- terraform/terraform_test.go | 20 +++++++++++++++ .../test-fixtures/diff-provider-init/main.tf | 9 +++++++ 3 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 terraform/test-fixtures/diff-provider-init/main.tf 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" {}