From 4bf3cd44fc7e1f35529360d8b3cb13a914f6021f Mon Sep 17 00:00:00 2001 From: Adrien Delorme Date: Thu, 10 Jan 2019 15:27:02 +0100 Subject: [PATCH] allow to skip a post processor --- command/build_test.go | 6 ++--- command/meta.go | 22 +++++++++---------- .../test-fixtures/build-only/template.json | 2 ++ packer/core.go | 21 ++++++++++++++---- template/parse.go | 3 ++- template/template.go | 3 ++- 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/command/build_test.go b/command/build_test.go index e0a22b268..7cdf4a9a4 100644 --- a/command/build_test.go +++ b/command/build_test.go @@ -102,7 +102,7 @@ func TestBuildExceptFileCommaFlags(t *testing.T) { } args := []string{ - "-except=chocolate", + "-except=chocolate,apple", filepath.Join(testFixture("build-only"), "template.json"), } @@ -112,12 +112,12 @@ func TestBuildExceptFileCommaFlags(t *testing.T) { fatalCommand(t, c.Meta) } - for _, f := range []string{"chocolate.txt"} { + for _, f := range []string{"chocolate.txt", "apple.txt"} { if fileExists(f) { t.Errorf("Expected NOT to find %s", f) } } - for _, f := range []string{"vanilla.txt", "cherry.txt", "apple.txt", "peach.txt"} { + for _, f := range []string{"vanilla.txt", "cherry.txt", "peach.txt"} { if !fileExists(f) { t.Errorf("Expected to find %s", f) } diff --git a/command/meta.go b/command/meta.go index b8dfdfbf5..5407c802e 100644 --- a/command/meta.go +++ b/command/meta.go @@ -6,8 +6,8 @@ import ( "fmt" "io" - "github.com/hashicorp/packer/helper/flag-kv" - "github.com/hashicorp/packer/helper/flag-slice" + kvflag "github.com/hashicorp/packer/helper/flag-kv" + sliceflag "github.com/hashicorp/packer/helper/flag-slice" "github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/template" ) @@ -31,9 +31,7 @@ type Meta struct { Version string // These are set by command-line flags - flagBuildExcept []string - flagBuildOnly []string - flagVars map[string]string + flagVars map[string]string } // Core returns the core for the given template given the configured @@ -59,7 +57,7 @@ func (m *Meta) BuildNames(c *packer.Core) []string { // TODO: test // Filter the "only" - if len(m.flagBuildOnly) > 0 { + if len(m.CoreConfig.Only) > 0 { // Build a set of all the available names nameSet := make(map[string]struct{}) for _, n := range c.BuildNames() { @@ -67,8 +65,8 @@ func (m *Meta) BuildNames(c *packer.Core) []string { } // Build our result set which we pre-allocate some sane number - result := make([]string, 0, len(m.flagBuildOnly)) - for _, n := range m.flagBuildOnly { + result := make([]string, 0, len(m.CoreConfig.Only)) + for _, n := range m.CoreConfig.Only { if _, ok := nameSet[n]; ok { result = append(result, n) } @@ -78,10 +76,10 @@ func (m *Meta) BuildNames(c *packer.Core) []string { } // Filter the "except" - if len(m.flagBuildExcept) > 0 { + if len(m.CoreConfig.Except) > 0 { // Build a set of the things we don't want nameSet := make(map[string]struct{}) - for _, n := range m.flagBuildExcept { + for _, n := range m.CoreConfig.Except { nameSet[n] = struct{}{} } @@ -111,8 +109,8 @@ func (m *Meta) FlagSet(n string, fs FlagSetFlags) *flag.FlagSet { // FlagSetBuildFilter tells us to enable the settings for selecting // builds we care about. if fs&FlagSetBuildFilter != 0 { - f.Var((*sliceflag.StringFlag)(&m.flagBuildExcept), "except", "") - f.Var((*sliceflag.StringFlag)(&m.flagBuildOnly), "only", "") + f.Var((*sliceflag.StringFlag)(&m.CoreConfig.Except), "except", "") + f.Var((*sliceflag.StringFlag)(&m.CoreConfig.Only), "only", "") } // FlagSetVars tells us what variables to use diff --git a/command/test-fixtures/build-only/template.json b/command/test-fixtures/build-only/template.json index e5b0d6d09..036990227 100644 --- a/command/test-fixtures/build-only/template.json +++ b/command/test-fixtures/build-only/template.json @@ -21,10 +21,12 @@ ], "post-processors": [ { + "name": "apple", "type": "shell-local", "inline": ["touch apple.txt"] }, { + "name": "peach", "type": "shell-local", "inline": ["touch peach.txt"] } diff --git a/packer/core.go b/packer/core.go index 86994ca29..c81745148 100644 --- a/packer/core.go +++ b/packer/core.go @@ -4,8 +4,8 @@ import ( "fmt" "sort" - "github.com/hashicorp/go-multierror" - "github.com/hashicorp/go-version" + multierror "github.com/hashicorp/go-multierror" + version "github.com/hashicorp/go-version" "github.com/hashicorp/packer/template" "github.com/hashicorp/packer/template/interpolate" ) @@ -20,6 +20,9 @@ type Core struct { builds map[string]*template.Builder version string secrets []string + + except []string + only []string } // CoreConfig is the structure for initializing a new Core. Once a CoreConfig @@ -30,6 +33,10 @@ type CoreConfig struct { Variables map[string]string SensitiveVariables []string Version string + + // These are set by command-line flags + Except []string + Only []string } // The function type used to lookup Builder implementations. @@ -61,6 +68,8 @@ func NewCore(c *CoreConfig) (*Core, error) { components: c.Components, variables: c.Variables, version: c.Version, + only: c.Only, + except: c.Except, } if err := result.validate(); err != nil { @@ -126,7 +135,7 @@ func (c *Core) Build(n string) (Build, error) { provisioners := make([]coreBuildProvisioner, 0, len(c.Template.Provisioners)) for _, rawP := range c.Template.Provisioners { // If we're skipping this, then ignore it - if rawP.Skip(rawName) { + if rawP.OnlyExcept.Skip(rawName) { continue } @@ -172,7 +181,11 @@ func (c *Core) Build(n string) (Build, error) { current := make([]coreBuildPostProcessor, 0, len(rawPs)) for _, rawP := range rawPs { // If we skip, ignore - if rawP.Skip(rawName) { + rawP.OnlyExcept.Except = append(rawP.OnlyExcept.Except, c.except...) + if rawP.OnlyExcept.Skip(rawName) { + continue + } + if rawP.OnlyExcept.Skip(rawP.Name) { continue } diff --git a/template/parse.go b/template/parse.go index a2d337300..9f37929a3 100644 --- a/template/parse.go +++ b/template/parse.go @@ -11,7 +11,7 @@ import ( "sort" "strings" - "github.com/hashicorp/go-multierror" + multierror "github.com/hashicorp/go-multierror" "github.com/hashicorp/packer/packer/tmp" "github.com/mitchellh/mapstructure" ) @@ -149,6 +149,7 @@ func (r *rawTemplate) Template() (*Template, error) { delete(c, "only") delete(c, "keep_input_artifact") delete(c, "type") + delete(c, "name") if len(c) > 0 { pp.Config = c } diff --git a/template/template.go b/template/template.go index 73bc094e4..3a0a372aa 100644 --- a/template/template.go +++ b/template/template.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "github.com/hashicorp/go-multierror" + multierror "github.com/hashicorp/go-multierror" ) // Template represents the parsed template that is used to configure @@ -40,6 +40,7 @@ type Builder struct { type PostProcessor struct { OnlyExcept `mapstructure:",squash"` + Name string Type string KeepInputArtifact bool `mapstructure:"keep_input_artifact"` Config map[string]interface{}