github.com/askholme/packer@v0.7.2-0.20140924152349-70d9566a6852/builder/parallels/common/tools_config.go (about)

     1  package common
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"github.com/mitchellh/packer/packer"
     7  	"text/template"
     8  )
     9  
    10  // These are the different valid mode values for "parallels_tools_mode" which
    11  // determine how guest additions are delivered to the guest.
    12  const (
    13  	ParallelsToolsModeDisable string = "disable"
    14  	ParallelsToolsModeAttach         = "attach"
    15  	ParallelsToolsModeUpload         = "upload"
    16  )
    17  
    18  type ToolsConfig struct {
    19  	ParallelsToolsFlavor    string `mapstructure:"parallels_tools_flavor"`
    20  	ParallelsToolsGuestPath string `mapstructure:"parallels_tools_guest_path"`
    21  	ParallelsToolsMode      string `mapstructure:"parallels_tools_mode"`
    22  }
    23  
    24  func (c *ToolsConfig) Prepare(t *packer.ConfigTemplate) []error {
    25  	if c.ParallelsToolsMode == "" {
    26  		c.ParallelsToolsMode = ParallelsToolsModeUpload
    27  	}
    28  
    29  	if c.ParallelsToolsGuestPath == "" {
    30  		c.ParallelsToolsGuestPath = "prl-tools-{{.Flavor}}.iso"
    31  	}
    32  
    33  	templates := map[string]*string{
    34  		"parallels_tools_flavor": &c.ParallelsToolsFlavor,
    35  		"parallels_tools_mode":   &c.ParallelsToolsMode,
    36  	}
    37  
    38  	var err error
    39  	errs := make([]error, 0)
    40  	for n, ptr := range templates {
    41  		*ptr, err = t.Process(*ptr, nil)
    42  		if err != nil {
    43  			errs = append(errs, fmt.Errorf("Error processing %s: %s", n, err))
    44  		}
    45  	}
    46  
    47  	if _, err := template.New("path").Parse(c.ParallelsToolsGuestPath); err != nil {
    48  		errs = append(errs, fmt.Errorf("parallels_tools_guest_path invalid: %s", err))
    49  	}
    50  
    51  	validMode := false
    52  	validModes := []string{
    53  		ParallelsToolsModeDisable,
    54  		ParallelsToolsModeAttach,
    55  		ParallelsToolsModeUpload,
    56  	}
    57  
    58  	for _, mode := range validModes {
    59  		if c.ParallelsToolsMode == mode {
    60  			validMode = true
    61  			break
    62  		}
    63  	}
    64  
    65  	if !validMode {
    66  		errs = append(errs,
    67  			fmt.Errorf("parallels_tools_mode is invalid. Must be one of: %v",
    68  				validModes))
    69  	}
    70  
    71  	if c.ParallelsToolsFlavor == "" {
    72  		if c.ParallelsToolsMode != ParallelsToolsModeDisable {
    73  			errs = append(errs, errors.New("parallels_tools_flavor must be specified."))
    74  		}
    75  	}
    76  
    77  	return errs
    78  }