github.com/kaixiang/packer@v0.5.2-0.20140114230416-1f5786b0d7f1/command/fix/fixer_pp_vagrant_override.go (about)

     1  package fix
     2  
     3  import (
     4  	"github.com/mitchellh/mapstructure"
     5  )
     6  
     7  // FixerVagrantPPOvveride is a Fixer that replaces the provider-specific
     8  // overrides for the Vagrant post-processor with the new style introduced
     9  // as part of Packer 0.5.0.
    10  type FixerVagrantPPOverride struct{}
    11  
    12  func (FixerVagrantPPOverride) Fix(input map[string]interface{}) (map[string]interface{}, error) {
    13  	// Our template type we'll use for this fixer only
    14  	type template struct {
    15  		PostProcessors []interface{} `mapstructure:"post-processors"`
    16  	}
    17  
    18  	// Decode the input into our structure, if we can
    19  	var tpl template
    20  	if err := mapstructure.Decode(input, &tpl); err != nil {
    21  		return nil, err
    22  	}
    23  
    24  	// Go through each post-processor and get out all the complex configs
    25  	pps := make([]map[string]interface{}, 0, len(tpl.PostProcessors))
    26  	for _, rawPP := range tpl.PostProcessors {
    27  		switch pp := rawPP.(type) {
    28  		case string:
    29  		case map[string]interface{}:
    30  			pps = append(pps, pp)
    31  		case []interface{}:
    32  			for _, innerRawPP := range pp {
    33  				if innerPP, ok := innerRawPP.(map[string]interface{}); ok {
    34  					pps = append(pps, innerPP)
    35  				}
    36  			}
    37  		}
    38  	}
    39  
    40  	// Go through each post-processor and make the fix if necessary
    41  	possible := []string{"aws", "digitalocean", "virtualbox", "vmware"}
    42  	for _, pp := range pps {
    43  		typeRaw, ok := pp["type"]
    44  		if !ok {
    45  			continue
    46  		}
    47  
    48  		if typeName, ok := typeRaw.(string); !ok {
    49  			continue
    50  		} else if typeName != "vagrant" {
    51  			continue
    52  		}
    53  
    54  		overrides := make(map[string]interface{})
    55  		for _, name := range possible {
    56  			if _, ok := pp[name]; !ok {
    57  				continue
    58  			}
    59  
    60  			overrides[name] = pp[name]
    61  			delete(pp, name)
    62  		}
    63  
    64  		if len(overrides) > 0 {
    65  			pp["override"] = overrides
    66  		}
    67  	}
    68  
    69  	input["post-processors"] = tpl.PostProcessors
    70  	return input, nil
    71  }
    72  
    73  func (FixerVagrantPPOverride) Synopsis() string {
    74  	return `Fixes provider-specific overrides for Vagrant post-processor`
    75  }