Commit 079d6f4d authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

packer: Introduce Cancel() method to Builder

parent e21d389f
...@@ -102,3 +102,6 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact { ...@@ -102,3 +102,6 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact {
// Build the artifact and return it // Build the artifact and return it
return &artifact{state["amis"].(map[string]string)} return &artifact{state["amis"].(map[string]string)}
} }
func (b *Builder) Cancel() {
}
...@@ -2,14 +2,17 @@ package packer ...@@ -2,14 +2,17 @@ package packer
// Implementers of Builder are responsible for actually building images // Implementers of Builder are responsible for actually building images
// on some platform given some configuration. // on some platform given some configuration.
//
// Prepare is responsible for reading in some configuration, in the raw form
// of map[string]interface{}, and storing that state for use later. Any setup
// should be done in this method. Note that NO side effects should really take
// place in prepare. It is meant as a state setup step only.
//
// Run is where the actual build should take place. It takes a Build and a Ui.
type Builder interface { type Builder interface {
// Prepare is responsible for reading in some configuration, in the raw form
// of map[string]interface{}, and storing that state for use later. Any setup
// should be done in this method. Note that NO side effects should really take
// place in prepare. It is meant as a state setup step only.
Prepare(config interface{}) error Prepare(config interface{}) error
// Run is where the actual build should take place. It takes a Build and a Ui.
Run(ui Ui, hook Hook) Artifact Run(ui Ui, hook Hook) Artifact
// Cancel cancels a possibly running Builder. This should block until
// the builder actually cancels and cleans up after itself.
Cancel()
} }
...@@ -6,6 +6,7 @@ type TestBuilder struct { ...@@ -6,6 +6,7 @@ type TestBuilder struct {
runCalled bool runCalled bool
runHook Hook runHook Hook
runUi Ui runUi Ui
cancelCalled bool
} }
func (tb *TestBuilder) Prepare(config interface{}) error { func (tb *TestBuilder) Prepare(config interface{}) error {
...@@ -20,3 +21,7 @@ func (tb *TestBuilder) Run(ui Ui, h Hook) Artifact { ...@@ -20,3 +21,7 @@ func (tb *TestBuilder) Run(ui Ui, h Hook) Artifact {
tb.runUi = ui tb.runUi = ui
return nil return nil
} }
func (tb *TestBuilder) Cancel() {
tb.cancelCalled = true
}
...@@ -31,6 +31,9 @@ func (b *cmdBuilder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact { ...@@ -31,6 +31,9 @@ func (b *cmdBuilder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact {
return b.builder.Run(ui, hook) return b.builder.Run(ui, hook)
} }
func (b *cmdBuilder) Cancel() {
}
func (c *cmdBuilder) checkExit(p interface{}, cb func()) { func (c *cmdBuilder) checkExit(p interface{}, cb func()) {
if c.client.Exited() && cb != nil { if c.client.Exited() && cb != nil {
cb() cb()
......
...@@ -17,6 +17,8 @@ func (helperBuilder) Run(packer.Ui, packer.Hook) packer.Artifact { ...@@ -17,6 +17,8 @@ func (helperBuilder) Run(packer.Ui, packer.Hook) packer.Artifact {
return nil return nil
} }
func (helperBuilder) Cancel() {}
func TestBuilder_NoExist(t *testing.T) { func TestBuilder_NoExist(t *testing.T) {
assert := asserts.NewTestingAsserts(t, true) assert := asserts.NewTestingAsserts(t, true)
......
...@@ -60,6 +60,10 @@ func (b *builder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact { ...@@ -60,6 +60,10 @@ func (b *builder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact {
return Artifact(client) return Artifact(client)
} }
func (b *builder) Cancel() {
}
func (b *BuilderServer) Prepare(args *BuilderPrepareArgs, reply *error) error { func (b *BuilderServer) Prepare(args *BuilderPrepareArgs, reply *error) error {
err := b.builder.Prepare(args.Config) err := b.builder.Prepare(args.Config)
if err != nil { if err != nil {
......
...@@ -15,6 +15,7 @@ type testBuilder struct { ...@@ -15,6 +15,7 @@ type testBuilder struct {
runCalled bool runCalled bool
runHook packer.Hook runHook packer.Hook
runUi packer.Ui runUi packer.Ui
cancelCalled bool
} }
func (b *testBuilder) Prepare(config interface{}) error { func (b *testBuilder) Prepare(config interface{}) error {
...@@ -30,6 +31,10 @@ func (b *testBuilder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact { ...@@ -30,6 +31,10 @@ func (b *testBuilder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact {
return testBuilderArtifact return testBuilderArtifact
} }
func (b *testBuilder) Cancel() {
b.cancelCalled = true
}
func TestBuilderRPC(t *testing.T) { func TestBuilderRPC(t *testing.T) {
assert := asserts.NewTestingAsserts(t, true) assert := asserts.NewTestingAsserts(t, true)
......
...@@ -20,7 +20,7 @@ func TestColoredUi(t *testing.T) { ...@@ -20,7 +20,7 @@ func TestColoredUi(t *testing.T) {
ui := &ColoredUi{UiColorRed, bufferUi} ui := &ColoredUi{UiColorRed, bufferUi}
ui.Say("foo") ui.Say("foo")
assert.Equal(readWriter(bufferUi), "\033[0;31;40mfoo\033[0m\n", "should have color") assert.Equal(readWriter(bufferUi), "\033[1;31;40mfoo\033[0m\n", "should have color")
} }
func TestPrefixedUi(t *testing.T) { func TestPrefixedUi(t *testing.T) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment