packer: builds now have post processors as part of them

This commit is contained in:
Mitchell Hashimoto 2013-06-18 09:58:39 -07:00
parent eee22b32f6
commit d95f0a620a
3 changed files with 59 additions and 12 deletions

View File

@ -44,17 +44,25 @@ type Build interface {
// multiple files, of course, but it should be for only a single provider // multiple files, of course, but it should be for only a single provider
// (such as VirtualBox, EC2, etc.). // (such as VirtualBox, EC2, etc.).
type coreBuild struct { type coreBuild struct {
name string name string
builder Builder builder Builder
builderConfig interface{} builderConfig interface{}
hooks map[string][]Hook hooks map[string][]Hook
provisioners []coreBuildProvisioner postProcessors [][]coreBuildPostProcessor
provisioners []coreBuildProvisioner
debug bool debug bool
l sync.Mutex l sync.Mutex
prepareCalled bool prepareCalled bool
} }
// Keeps track of the post-processor and the configuration of the
// post-processor used within a build.
type coreBuildPostProcessor struct {
processor PostProcessor
config interface{}
}
// Keeps track of the provisioner and the configuration of the provisioner // Keeps track of the provisioner and the configuration of the provisioner
// within the build. // within the build.
type coreBuildProvisioner struct { type coreBuildProvisioner struct {

View File

@ -285,6 +285,29 @@ func (t *Template) Build(name string, components *ComponentFinder) (b Build, err
hooks[tplEvent] = curHooks hooks[tplEvent] = curHooks
} }
// Prepare the post-processors
postProcessors := make([][]coreBuildPostProcessor, 0, len(t.PostProcessors))
for _, rawPPs := range t.PostProcessors {
current := make([]coreBuildPostProcessor, len(rawPPs))
for i, rawPP := range rawPPs {
pp, err := components.PostProcessor(rawPP.Type)
if err != nil {
return nil, err
}
if pp == nil {
return nil, fmt.Errorf("PostProcessor type not found: %s", rawPP.Type)
}
current[i] = coreBuildPostProcessor{
processor: pp,
config: rawPP.rawConfig,
}
}
postProcessors = append(postProcessors, current)
}
// Prepare the provisioners // Prepare the provisioners
provisioners := make([]coreBuildProvisioner, 0, len(t.Provisioners)) provisioners := make([]coreBuildProvisioner, 0, len(t.Provisioners))
for _, rawProvisioner := range t.Provisioners { for _, rawProvisioner := range t.Provisioners {
@ -313,11 +336,12 @@ func (t *Template) Build(name string, components *ComponentFinder) (b Build, err
} }
b = &coreBuild{ b = &coreBuild{
name: name, name: name,
builder: builder, builder: builder,
builderConfig: builderConfig.rawConfig, builderConfig: builderConfig.rawConfig,
hooks: hooks, hooks: hooks,
provisioners: provisioners, postProcessors: postProcessors,
provisioners: provisioners,
} }
return return

View File

@ -443,6 +443,11 @@ func TestTemplate_Build(t *testing.T) {
{ {
"type": "test-prov" "type": "test-prov"
} }
],
"post-processors": [
"simple",
["simple", "simple"]
] ]
} }
` `
@ -465,11 +470,18 @@ func TestTemplate_Build(t *testing.T) {
"test-prov": provisioner, "test-prov": provisioner,
} }
pp := new(TestPostProcessor)
ppMap := map[string]PostProcessor{
"simple": pp,
}
builderFactory := func(n string) (Builder, error) { return builderMap[n], nil } builderFactory := func(n string) (Builder, error) { return builderMap[n], nil }
ppFactory := func(n string) (PostProcessor, error) { return ppMap[n], nil }
provFactory := func(n string) (Provisioner, error) { return provisionerMap[n], nil } provFactory := func(n string) (Provisioner, error) { return provisionerMap[n], nil }
components := &ComponentFinder{ components := &ComponentFinder{
Builder: builderFactory, Builder: builderFactory,
Provisioner: provFactory, PostProcessor: ppFactory,
Provisioner: provFactory,
} }
// Get the build, verifying we can get it without issue, but also // Get the build, verifying we can get it without issue, but also
@ -482,6 +494,9 @@ func TestTemplate_Build(t *testing.T) {
assert.Equal(coreBuild.builder, builder, "should have the same builder") assert.Equal(coreBuild.builder, builder, "should have the same builder")
assert.Equal(coreBuild.builderConfig, expectedConfig, "should have proper config") assert.Equal(coreBuild.builderConfig, expectedConfig, "should have proper config")
assert.Equal(len(coreBuild.provisioners), 1, "should have one provisioner") assert.Equal(len(coreBuild.provisioners), 1, "should have one provisioner")
assert.Equal(len(coreBuild.postProcessors), 2, "should have pps")
assert.Equal(len(coreBuild.postProcessors[0]), 1, "should have correct number")
assert.Equal(len(coreBuild.postProcessors[1]), 2, "should have correct number")
} }
func TestTemplate_Build_ProvisionerOverride(t *testing.T) { func TestTemplate_Build_ProvisionerOverride(t *testing.T) {