From d95f0a620ac902510e616cd3c157e4bf224bd14e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 18 Jun 2013 09:58:39 -0700 Subject: [PATCH] packer: builds now have post processors as part of them --- packer/build.go | 18 +++++++++++++----- packer/template.go | 34 +++++++++++++++++++++++++++++----- packer/template_test.go | 19 +++++++++++++++++-- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/packer/build.go b/packer/build.go index 077f8759a..66987759d 100644 --- a/packer/build.go +++ b/packer/build.go @@ -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 { diff --git a/packer/template.go b/packer/template.go index bdb8185c0..f2a743e6c 100644 --- a/packer/template.go +++ b/packer/template.go @@ -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 diff --git a/packer/template_test.go b/packer/template_test.go index 3347d2bdc..ac89cb901 100644 --- a/packer/template_test.go +++ b/packer/template_test.go @@ -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) {