diff --git a/packer/build.go b/packer/build.go index d2502625a..97d6d5f8a 100644 --- a/packer/build.go +++ b/packer/build.go @@ -52,7 +52,7 @@ func (b *coreBuild) Prepare(ui Ui) (err error) { // Prepare the provisioners // TODO: error handling for _, coreProv := range b.provisioners { - coreProv.provisioner.Prepare(coreProv.config, ui) + coreProv.provisioner.Prepare(coreProv.config) } return diff --git a/packer/build_test.go b/packer/build_test.go index a8870a59a..fb748561c 100644 --- a/packer/build_test.go +++ b/packer/build_test.go @@ -47,8 +47,7 @@ func TestBuild_Prepare(t *testing.T) { 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") + assert.Equal(prov.prepConfigs, []interface{}{42}, "prepare should be called with proper config") } func TestBuild_Run(t *testing.T) { diff --git a/packer/plugin/provisioner.go b/packer/plugin/provisioner.go index 93e6fb1bb..3655bb798 100644 --- a/packer/plugin/provisioner.go +++ b/packer/plugin/provisioner.go @@ -13,13 +13,13 @@ type cmdProvisioner struct { client *client } -func (c *cmdProvisioner) Prepare(config interface{}, ui packer.Ui) { +func (c *cmdProvisioner) Prepare(configs ...interface{}) { defer func() { r := recover() c.checkExit(r, nil) }() - c.p.Prepare(config, ui) + c.p.Prepare(configs...) } func (c *cmdProvisioner) Provision(ui packer.Ui, comm packer.Communicator) { diff --git a/packer/plugin/provisioner_test.go b/packer/plugin/provisioner_test.go index 39d489360..dc0bb4d88 100644 --- a/packer/plugin/provisioner_test.go +++ b/packer/plugin/provisioner_test.go @@ -9,7 +9,7 @@ import ( type helperProvisioner byte -func (helperProvisioner) Prepare(interface{}, packer.Ui) {} +func (helperProvisioner) Prepare(...interface{}) {} func (helperProvisioner) Provision(packer.Ui, packer.Communicator) {} diff --git a/packer/provisioner.go b/packer/provisioner.go index 07a2052f0..db389eddb 100644 --- a/packer/provisioner.go +++ b/packer/provisioner.go @@ -6,7 +6,7 @@ type Provisioner interface { // Prepare is called with the raw configuration and a UI element in // order to setup the internal state of the provisioner and perform // any validation necessary for the provisioner. - Prepare(interface{}, Ui) + Prepare(...interface{}) // Provision is called to actually provision the machine. A UI is // given to communicate with the user, and a communicator is given that diff --git a/packer/provisioner_test.go b/packer/provisioner_test.go index 08133fcdc..cf800e4d6 100644 --- a/packer/provisioner_test.go +++ b/packer/provisioner_test.go @@ -4,15 +4,13 @@ import "testing" type TestProvisioner struct { prepCalled bool - prepConfig interface{} - prepUi Ui + prepConfigs []interface{} provCalled bool } -func (t *TestProvisioner) Prepare(config interface{}, ui Ui) { +func (t *TestProvisioner) Prepare(configs ...interface{}) { t.prepCalled = true - t.prepConfig = config - t.prepUi = ui + t.prepConfigs = configs } func (t *TestProvisioner) Provision(Ui, Communicator) { diff --git a/packer/rpc/provisioner.go b/packer/rpc/provisioner.go index 027667d8e..e66a974c5 100644 --- a/packer/rpc/provisioner.go +++ b/packer/rpc/provisioner.go @@ -18,8 +18,7 @@ type ProvisionerServer struct { } type ProvisionerPrepareArgs struct { - Config interface{} - RPCAddress string + Configs []interface{} } type ProvisionerProvisionArgs struct { @@ -29,12 +28,8 @@ type ProvisionerProvisionArgs struct { func Provisioner(client *rpc.Client) *provisioner { return &provisioner{client} } -func (p *provisioner) Prepare(config interface{}, ui packer.Ui) { - // TODO: Error handling - server := rpc.NewServer() - RegisterUi(server, ui) - - args := &ProvisionerPrepareArgs{config, serveSingleConn(server)} +func (p *provisioner) Prepare(configs ...interface{}) { + args := &ProvisionerPrepareArgs{configs} p.client.Call("Provisioner.Prepare", args, new(interface{})) } @@ -49,14 +44,7 @@ func (p *provisioner) Provision(ui packer.Ui, comm packer.Communicator) { } func (p *ProvisionerServer) Prepare(args *ProvisionerPrepareArgs, reply *interface{}) error { - client, err := rpc.Dial("tcp", args.RPCAddress) - if err != nil { - return err - } - - ui := &Ui{client} - - p.p.Prepare(args.Config, ui) + p.p.Prepare(args.Configs...) return nil } diff --git a/packer/rpc/provisioner_test.go b/packer/rpc/provisioner_test.go index e35019a18..c8dc1a696 100644 --- a/packer/rpc/provisioner_test.go +++ b/packer/rpc/provisioner_test.go @@ -9,17 +9,15 @@ import ( type testProvisioner struct { prepareCalled bool - prepareConfig interface{} - prepareUi packer.Ui + prepareConfigs []interface{} provCalled bool provComm packer.Communicator provUi packer.Ui } -func (p *testProvisioner) Prepare(config interface{}, ui packer.Ui) { +func (p *testProvisioner) Prepare(configs ...interface{}) { p.prepareCalled = true - p.prepareConfig = config - p.prepareUi = ui + p.prepareConfigs = configs } func (p *testProvisioner) Provision(ui packer.Ui, comm packer.Communicator) { @@ -45,17 +43,13 @@ func TestProvisionerRPC(t *testing.T) { // Test Prepare config := 42 - ui := &testUi{} pClient := Provisioner(client) - pClient.Prepare(config, ui) + pClient.Prepare(config) assert.True(p.prepareCalled, "prepare should be called") - assert.Equal(p.prepareConfig, 42, "prepare should be called with right arg") - - p.prepareUi.Say("foo") - assert.True(ui.sayCalled, "say should be called") + assert.Equal(p.prepareConfigs, []interface{}{42}, "prepare should be called with right arg") // Test Provision - ui = &testUi{} + ui := &testUi{} comm := &testCommunicator{} pClient.Provision(ui, comm) assert.True(p.provCalled, "provision should be called") diff --git a/provisioner/shell/provisioner.go b/provisioner/shell/provisioner.go index 170aba46d..74d31dd34 100644 --- a/provisioner/shell/provisioner.go +++ b/provisioner/shell/provisioner.go @@ -29,9 +29,11 @@ type Provisioner struct { config config } -func (p *Provisioner) Prepare(raw interface{}, ui packer.Ui) { +func (p *Provisioner) Prepare(raws ...interface{}) { // TODO: errors - _ = mapstructure.Decode(raw, &p.config) + for _, raw := range raws { + _ = mapstructure.Decode(raw, &p.config) + } if p.config.RemotePath == "" { p.config.RemotePath = DefaultRemotePath