Commit d95f0a62 authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

packer: builds now have post processors as part of them

parent eee22b32
......@@ -44,17 +44,25 @@ type Build interface {
// multiple files, of course, but it should be for only a single provider
// (such as VirtualBox, EC2, etc.).
type coreBuild struct {
name string
builder Builder
builderConfig interface{}
hooks map[string][]Hook
provisioners []coreBuildProvisioner
name string
builder Builder
builderConfig interface{}
hooks map[string][]Hook
postProcessors [][]coreBuildPostProcessor
provisioners []coreBuildProvisioner
debug bool
l sync.Mutex
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
// within the build.
type coreBuildProvisioner struct {
......
......@@ -285,6 +285,29 @@ func (t *Template) Build(name string, components *ComponentFinder) (b Build, err
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
provisioners := make([]coreBuildProvisioner, 0, len(t.Provisioners))
for _, rawProvisioner := range t.Provisioners {
......@@ -313,11 +336,12 @@ func (t *Template) Build(name string, components *ComponentFinder) (b Build, err
}
b = &coreBuild{
name: name,
builder: builder,
builderConfig: builderConfig.rawConfig,
hooks: hooks,
provisioners: provisioners,
name: name,
builder: builder,
builderConfig: builderConfig.rawConfig,
hooks: hooks,
postProcessors: postProcessors,
provisioners: provisioners,
}
return
......
......@@ -443,6 +443,11 @@ func TestTemplate_Build(t *testing.T) {
{
"type": "test-prov"
}
],
"post-processors": [
"simple",
["simple", "simple"]
]
}
`
......@@ -465,11 +470,18 @@ func TestTemplate_Build(t *testing.T) {
"test-prov": provisioner,
}
pp := new(TestPostProcessor)
ppMap := map[string]PostProcessor{
"simple": pp,
}
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 }
components := &ComponentFinder{
Builder: builderFactory,
Provisioner: provFactory,
Builder: builderFactory,
PostProcessor: ppFactory,
Provisioner: provFactory,
}
// 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.builderConfig, expectedConfig, "should have proper config")
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) {
......
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