diff --git a/packer/build.go b/packer/build.go index a6402370b..ec21af594 100644 --- a/packer/build.go +++ b/packer/build.go @@ -39,12 +39,21 @@ func (b *coreBuild) Name() string { // Prepare prepares the build by doing some initialization for the builder // and any hooks. This _must_ be called prior to Run. func (b *coreBuild) Prepare(ui Ui) (err error) { + // TODO: lock b.prepareCalled = true + + // Prepare the builder err = b.builder.Prepare(b.builderConfig) if err != nil { log.Printf("Build '%s' prepare failure: %s\n", b.name, err) } + // Prepare the provisioners + // TODO: error handling + for _, coreProv := range b.provisioners { + coreProv.provisioner.Prepare(coreProv.config, ui) + } + return } diff --git a/packer/build_test.go b/packer/build_test.go index 8a56cc0bd..840aced33 100644 --- a/packer/build_test.go +++ b/packer/build_test.go @@ -31,6 +31,9 @@ func testBuild() Build { name: "test", builder: &TestBuilder{}, builderConfig: 42, + provisioners: []coreBuildProvisioner{ + coreBuildProvisioner{&TestProvisioner{}, 42}, + }, } } @@ -65,10 +68,19 @@ func TestBuild_Run(t *testing.T) { build.Prepare(ui) build.Run(ui) - builder := build.(*coreBuild).builder.(*TestBuilder) + coreB := build.(*coreBuild) + // Verify builder was prepared + builder := coreB.builder.(*TestBuilder) assert.True(builder.runCalled, "run should be called") assert.Equal(builder.runUi, ui, "run should be called with ui") + + // Verify provisioners were prepared + coreProv := coreB.provisioners[0] + prov := coreProv.provisioner.(*TestProvisioner) + assert.True(prov.prepCalled, "prepare should be called") + assert.Equal(prov.prepConfig, 42, "prepare should be called with proper config") + assert.Equal(prov.prepUi, ui, "prepare should be called with proper ui") } func TestBuild_RunBeforePrepare(t *testing.T) { diff --git a/packer/provisioner_test.go b/packer/provisioner_test.go index 068473b8a..75c497508 100644 --- a/packer/provisioner_test.go +++ b/packer/provisioner_test.go @@ -2,11 +2,15 @@ package packer type TestProvisioner struct { prepCalled bool + prepConfig interface{} + prepUi Ui provCalled bool } -func (t *TestProvisioner) Prepare(interface{}, Ui) { +func (t *TestProvisioner) Prepare(config interface{}, ui Ui) { t.prepCalled = true + t.prepConfig = config + t.prepUi = ui } func (t *TestProvisioner) Provision(Ui, Communicator) { diff --git a/packer/rpc/build_test.go b/packer/rpc/build_test.go index 5c8a53cd9..a163b27e9 100644 --- a/packer/rpc/build_test.go +++ b/packer/rpc/build_test.go @@ -12,7 +12,7 @@ var testBuildArtifact = &testArtifact{} type testBuild struct { nameCalled bool prepareCalled bool - prepareUi packer.Ui + prepareUi packer.Ui runCalled bool runUi packer.Ui }