packer: Build.Prepare takes a UI

This commit is contained in:
Mitchell Hashimoto 2013-05-22 16:20:40 -07:00
parent fbcc6cb2b2
commit cb91ca72ac
5 changed files with 31 additions and 12 deletions

View File

@ -64,7 +64,7 @@ func (Command) Run(env packer.Environment, args []string) int {
// Prepare all the builds // Prepare all the builds
for _, b := range builds { for _, b := range builds {
log.Printf("Preparing build: %s", b.Name()) log.Printf("Preparing build: %s", b.Name())
err := b.Prepare() err := b.Prepare(buildUis[b.Name()])
if err != nil { if err != nil {
env.Ui().Error(err.Error()) env.Ui().Error(err.Error())
return 1 return 1

View File

@ -6,7 +6,7 @@ import "log"
// building some machine image artifact. Builds are meant to be parallelized. // building some machine image artifact. Builds are meant to be parallelized.
type Build interface { type Build interface {
Name() string Name() string
Prepare() error Prepare(Ui) error
Run(Ui) Artifact Run(Ui) Artifact
} }
@ -38,7 +38,7 @@ func (b *coreBuild) Name() string {
// Prepare prepares the build by doing some initialization for the builder // Prepare prepares the build by doing some initialization for the builder
// and any hooks. This _must_ be called prior to Run. // and any hooks. This _must_ be called prior to Run.
func (b *coreBuild) Prepare() (err error) { func (b *coreBuild) Prepare(ui Ui) (err error) {
b.prepareCalled = true b.prepareCalled = true
err = b.builder.Prepare(b.builderConfig) err = b.builder.Prepare(b.builderConfig)
if err != nil { if err != nil {

View File

@ -51,7 +51,7 @@ func TestBuild_Prepare(t *testing.T) {
build := testBuild() build := testBuild()
builder := build.(*coreBuild).builder.(*TestBuilder) builder := build.(*coreBuild).builder.(*TestBuilder)
build.Prepare() build.Prepare(nil)
assert.True(builder.prepareCalled, "prepare should be called") assert.True(builder.prepareCalled, "prepare should be called")
assert.Equal(builder.prepareConfig, 42, "prepare config should be 42") assert.Equal(builder.prepareConfig, 42, "prepare config should be 42")
} }
@ -62,7 +62,7 @@ func TestBuild_Run(t *testing.T) {
ui := testUi() ui := testUi()
build := testBuild() build := testBuild()
build.Prepare() build.Prepare(ui)
build.Run(ui) build.Run(ui)
builder := build.(*coreBuild).builder.(*TestBuilder) builder := build.(*coreBuild).builder.(*TestBuilder)

View File

@ -17,7 +17,9 @@ type BuildServer struct {
build packer.Build build packer.Build
} }
type BuildPrepareArgs interface{} type BuildPrepareArgs struct {
RPCAddress string
}
type BuildRunArgs struct { type BuildRunArgs struct {
UiRPCAddress string UiRPCAddress string
@ -32,8 +34,17 @@ func (b *build) Name() (result string) {
return return
} }
func (b *build) Prepare() (err error) { func (b *build) Prepare(ui packer.Ui) (err error) {
b.client.Call("Build.Prepare", new(interface{}), &err) // Create and start the server for the UI
// TODO: Error handling
server := rpc.NewServer()
RegisterUi(server, ui)
args := &BuildPrepareArgs{serveSingleConn(server)}
if err := b.client.Call("Build.Prepare", args, &err); err != nil {
panic(err)
}
return return
} }
@ -63,7 +74,12 @@ func (b *BuildServer) Name(args *interface{}, reply *string) error {
} }
func (b *BuildServer) Prepare(args *BuildPrepareArgs, reply *error) error { func (b *BuildServer) Prepare(args *BuildPrepareArgs, reply *error) error {
*reply = b.build.Prepare() client, err := rpc.Dial("tcp", args.RPCAddress)
if err != nil {
return err
}
*reply = b.build.Prepare(&Ui{client})
return nil return nil
} }

View File

@ -12,6 +12,7 @@ var testBuildArtifact = &testArtifact{}
type testBuild struct { type testBuild struct {
nameCalled bool nameCalled bool
prepareCalled bool prepareCalled bool
prepareUi packer.Ui
runCalled bool runCalled bool
runUi packer.Ui runUi packer.Ui
} }
@ -21,8 +22,9 @@ func (b *testBuild) Name() string {
return "name" return "name"
} }
func (b *testBuild) Prepare() error { func (b *testBuild) Prepare(ui packer.Ui) error {
b.prepareCalled = true b.prepareCalled = true
b.prepareUi = ui
return nil return nil
} }
@ -53,11 +55,12 @@ func TestBuildRPC(t *testing.T) {
assert.True(b.nameCalled, "name should be called") assert.True(b.nameCalled, "name should be called")
// Test Prepare // Test Prepare
bClient.Prepare() ui := new(testUi)
bClient.Prepare(ui)
assert.True(b.prepareCalled, "prepare should be called") assert.True(b.prepareCalled, "prepare should be called")
// Test Run // Test Run
ui := new(testUi) ui = new(testUi)
bClient.Run(ui) bClient.Run(ui)
assert.True(b.runCalled, "run should be called") assert.True(b.runCalled, "run should be called")