From bda4754e686aee3746fbde35ac4737570489bf50 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Sep 2013 15:01:06 -0700 Subject: [PATCH] post-processor/vagrant: simplify logic, only send overrides to PP [GH-413] /cc @jasonberanek --- post-processor/vagrant/post-processor.go | 57 +++++++++++++----------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/post-processor/vagrant/post-processor.go b/post-processor/vagrant/post-processor.go index e6f629068..952f574ad 100644 --- a/post-processor/vagrant/post-processor.go +++ b/post-processor/vagrant/post-processor.go @@ -24,15 +24,12 @@ type Config struct { } type PostProcessor struct { - config Config - premade map[string]packer.PostProcessor - rawConfigs []interface{} + config Config + premade map[string]packer.PostProcessor + extraConfig map[string]interface{} } func (p *PostProcessor) Configure(raws ...interface{}) error { - // Store the raw configs for usage later - p.rawConfigs = raws - _, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err @@ -57,11 +54,8 @@ func (p *PostProcessor) Configure(raws ...interface{}) error { } // Store extra configuration we'll send to each post-processor type - ppExtraConfig := make(map[string]interface{}) - ppExtraConfig["output"] = p.config.OutputPath - - // Store the extra configuration for post-processors - p.rawConfigs = append(p.rawConfigs, ppExtraConfig) + p.extraConfig = make(map[string]interface{}) + p.extraConfig["output"] = p.config.OutputPath // TODO(mitchellh): Properly handle multiple raw configs. This isn't // very pressing at the moment because at the time of this comment @@ -75,18 +69,14 @@ func (p *PostProcessor) Configure(raws ...interface{}) error { p.premade = make(map[string]packer.PostProcessor) for k, raw := range mapConfig { - pp := keyToPostProcessor(k) - if pp == nil { + pp, err := p.subPostProcessor(k, raw, p.extraConfig) + if err != nil { + errs = packer.MultiErrorAppend(errs, err) continue } - // Create the proper list of configurations - ppConfigs := make([]interface{}, len(p.rawConfigs), len(p.rawConfigs)+1) - copy(ppConfigs, p.rawConfigs) - ppConfigs = append(ppConfigs, raw) - - if err := pp.Configure(ppConfigs...); err != nil { - errs = packer.MultiErrorAppend(errs, err) + if pp == nil { + continue } p.premade[k] = pp @@ -110,20 +100,37 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac pp, ok := p.premade[ppName] if !ok { log.Printf("Premade post-processor for '%s' not found. Creating.", ppName) - pp = keyToPostProcessor(ppName) - if pp == nil { - return nil, false, fmt.Errorf("Vagrant box post-processor not found: %s", ppName) - } - if err := pp.Configure(p.rawConfigs...); err != nil { + var err error + pp, err = p.subPostProcessor(ppName, nil, p.extraConfig) + if err != nil { return nil, false, err } + + if pp == nil { + return nil, false, fmt.Errorf("Vagrant box post-processor not found: %s", ppName) + } } ui.Say(fmt.Sprintf("Creating Vagrant box for '%s' provider", ppName)) return pp.PostProcess(ui, artifact) } +func (p *PostProcessor) subPostProcessor(key string, specific interface{}, extra map[string]interface{}) (packer.PostProcessor, error) { + pp := keyToPostProcessor(key) + if pp == nil { + return nil, nil + } + + if err := pp.Configure(extra, specific); err != nil { + return nil, err + } + + return pp, nil +} + +// keyToPostProcessor maps a configuration key to the actual post-processor +// it will be configuring. This returns a new instance of that post-processor. func keyToPostProcessor(key string) packer.PostProcessor { switch key { case "aws":