// This returns a mapstructure.DecodeHookFunc that automatically template // processes any configuration values that aren't strings but have been // provided as strings. // // For example: "image_id" wants an int and the user uses a string with // a user variable like "{{user `image_id`}}". This decode hook makes that // work. func decodeConfigHook(raws []interface{}) (mapstructure.DecodeHookFunc, error) { // First thing we do is decode PackerConfig so that we can have access // to the user variables so that we can process some templates. var pc PackerConfig for _, raw := range raws { if err := mapstructure.Decode(raw, &pc); err != nil { return nil, err } } tpl, err := packer.NewConfigTemplate() if err != nil { return nil, err } tpl.UserVars = pc.PackerUserVars return func(f reflect.Kind, t reflect.Kind, v interface{}) (interface{}, error) { if t != reflect.String { if sv, ok := v.(string); ok { var err error v, err = tpl.Process(sv, nil) if err != nil { return nil, err } } } return v, nil }, nil }
func (c *AccessConfig) Prepare(t *packer.ConfigTemplate) []error { if t == nil { var err error t, err = packer.NewConfigTemplate() if err != nil { return []error{err} } } templates := map[string]*string{ "username": &c.Username, "password": &c.Password, "provider": &c.Provider, } errs := make([]error, 0) for n, ptr := range templates { var err error *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if c.RawRegion == "" { errs = append(errs, fmt.Errorf("region must be specified")) } if len(errs) > 0 { return errs } return nil }
func (p *AWSBoxPostProcessor) Configure(raws ...interface{}) error { md, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars // Accumulate any errors errs := common.CheckUnusedConfig(md) validates := map[string]*string{ "output": &p.config.OutputPath, "vagrantfile_template": &p.config.VagrantfileTemplate, } for n, ptr := range validates { if err := p.config.tpl.Validate(*ptr); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error parsing %s: %s", n, err)) } } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
func (c *UserConfig) Validate() error { var err error c.tpl, err = packer.NewConfigTemplate() if err != nil { return err } c.tpl.UserVars = c.PackerUserVars errs := common.CheckUnusedConfig(c.metadata) err = c.validateDirPresence(c.AssetsDir, "assets_dir") if err != nil { errs = packer.MultiErrorAppend(errs, err) } if c.ManifestPath != nil { err = c.validateFilePresence(*c.ManifestPath, "manifest_path") if err != nil { errs = packer.MultiErrorAppend(errs, err) } } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { md, err := common.DecodeConfig(&b.config, raws...) if err != nil { return nil, err } b.config.tpl, err = packer.NewConfigTemplate() if err != nil { return nil, err } b.config.tpl.UserVars = b.config.PackerUserVars b.config.tpl.Funcs(awscommon.TemplateFuncs) // Accumulate any errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.WinRMConfig.Prepare(b.config.tpl)...) if errs != nil && len(errs.Errors) > 0 { return nil, errs } return nil, nil }
func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { md, err := common.DecodeConfig(&b.config, raws...) if err != nil { return nil, err } b.config.tpl, err = packer.NewConfigTemplate() if err != nil { return nil, err } b.config.tpl.UserVars = b.config.PackerUserVars // Accumulate any errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.ImageConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(b.config.tpl)...) if errs != nil && len(errs.Errors) > 0 { return nil, errs } log.Println(common.ScrubConfig(b.config, b.config.Password)) return nil, nil }
func (b *Builder) Prepare(raws ...interface{}) error { md, err := common.DecodeConfig(&b.config, raws...) if err != nil { return err } b.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } b.config.tpl.UserVars = b.config.PackerUserVars b.config.tpl.Funcs(awscommon.TemplateFuncs) // Accumulate any errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(b.config.tpl)...) if errs != nil && len(errs.Errors) > 0 { return errs } log.Println(common.ScrubConfig(b.config), b.config.AccessKey, b.config.SecretKey) return nil }
func (c *ImageConfig) Prepare(t *packer.ConfigTemplate) []error { if t == nil { var err error t, err = packer.NewConfigTemplate() if err != nil { return []error{err} } } templates := map[string]*string{ "image_name": &c.ImageName, } errs := make([]error, 0) for n, ptr := range templates { var err error *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if c.ImageName == "" { errs = append(errs, fmt.Errorf("An image_name must be specified")) } if len(errs) > 0 { return errs } return nil }
func (c *RunConfig) Prepare(t *packer.ConfigTemplate) []error { if t == nil { var err error t, err = packer.NewConfigTemplate() if err != nil { return []error{err} } } // Defaults if c.SSHUsername == "" { c.SSHUsername = "******" } if c.SSHPort == 0 { c.SSHPort = 22 } if c.RawSSHTimeout == "" { c.RawSSHTimeout = "1m" } // Validation var err error errs := make([]error, 0) if c.SourceImage == "" { errs = append(errs, errors.New("A source_image must be specified")) } if c.Flavor == "" { errs = append(errs, errors.New("A flavor must be specified")) } if c.SSHUsername == "" { errs = append(errs, errors.New("An ssh_username must be specified")) } templates := map[string]*string{ "flavlor": &c.Flavor, "ssh_timeout": &c.RawSSHTimeout, "ssh_username": &c.SSHUsername, "source_image": &c.SourceImage, } for n, ptr := range templates { var err error *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } c.sshTimeout, err = time.ParseDuration(c.RawSSHTimeout) if err != nil { errs = append(errs, fmt.Errorf("Failed parsing ssh_timeout: %s", err)) } return errs }
func testConfigTemplate(t *testing.T) *packer.ConfigTemplate { result, err := packer.NewConfigTemplate() if err != nil { t.Fatalf("err: %s", err) } return result }
func (p *PostProcessor) Configure(raws ...interface{}) error { _, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars // Defaults if p.config.DiskMode == "" { p.config.DiskMode = "thick" } // Accumulate any errors errs := new(packer.MultiError) if _, err := exec.LookPath("ovftool"); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("ovftool not found: %s", err)) } templates := map[string]*string{ "cluster": &p.config.Cluster, "datacenter": &p.config.Datacenter, "datastore": &p.config.Datastore, "diskmode": &p.config.DiskMode, "host": &p.config.Host, "vm_network": &p.config.VMNetwork, "password": &p.config.Password, "resource_pool": &p.config.ResourcePool, "username": &p.config.Username, "vm_folder": &p.config.VMFolder, "vm_name": &p.config.VMName, } for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", key)) } *ptr, err = p.config.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", key, err)) } } if len(errs.Errors) > 0 { return errs } return nil }
func NewConfig(raws ...interface{}) (*Config, []string, error) { c := new(Config) md, err := common.DecodeConfig(c, raws...) if err != nil { return nil, nil, err } c.tpl, err = packer.NewConfigTemplate() if err != nil { return nil, nil, err } // Default Pull if it wasn't set hasPull := false for _, k := range md.Keys { if k == "Pull" { hasPull = true break } } if !hasPull { c.Pull = true } errs := common.CheckUnusedConfig(md) templates := map[string]*string{ "export_path": &c.ExportPath, "image": &c.Image, } for n, ptr := range templates { var err error *ptr, err = c.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if c.ExportPath == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("export_path must be specified")) } if c.Image == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("image must be specified")) } if errs != nil && len(errs.Errors) > 0 { return nil, nil, errs } return c, nil, nil }
func (p *Provisioner) Prepare(raws ...interface{}) error { md, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars // Accumulate any errors errs := common.CheckUnusedConfig(md) if p.config.StagingDir == "" { p.config.StagingDir = DefaultStagingDir } // Templates templates := map[string]*string{ "staging_dir": &p.config.StagingDir, } for n, ptr := range templates { var err error *ptr, err = p.config.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } // Validation err = validateFileConfig(p.config.PlaybookFile, "playbook_file", true) if err != nil { errs = packer.MultiErrorAppend(errs, err) } for _, path := range p.config.PlaybookPaths { err := validateDirConfig(path, "playbook_paths") if err != nil { errs = packer.MultiErrorAppend(errs, err) } } for _, path := range p.config.RolePaths { if err := validateDirConfig(path, "role_paths"); err != nil { errs = packer.MultiErrorAppend(errs, err) } } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
func (builder *Builder) Prepare(raws ...interface{}) ([]string, error) { md, err := common.DecodeConfig(&builder.config, raws...) if err != nil { return nil, err } builder.config.tpl, err = packer.NewConfigTemplate() if err != nil { return nil, err } builder.config.tpl.UserVars = builder.config.PackerUserVars builder.config.tpl.Funcs(awscommon.TemplateFuncs) if builder.config.VolumeSize == 0 { builder.config.VolumeSize = 12 } if builder.config.VolumeType == "" { builder.config.VolumeType = "standard" } if builder.config.RootDeviceName == "" { builder.config.RootDeviceName = "/dev/xvda" } builder.ensureWorkerDeviceMapping() // Accumulate any errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, builder.config.AccessConfig.Prepare(builder.config.tpl)...) errs = packer.MultiErrorAppend(errs, builder.config.BlockDevices.Prepare(builder.config.tpl)...) errs = packer.MultiErrorAppend(errs, builder.config.AMIConfig.Prepare(builder.config.tpl)...) errs = packer.MultiErrorAppend(errs, builder.config.RunConfig.Prepare(builder.config.tpl)...) templates := map[string]*string{ "worker_device_name": &builder.config.WorkerDeviceName, "root_device_name": &builder.config.RootDeviceName, } for n, ptr := range templates { var err error *ptr, err = builder.config.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if errs != nil && len(errs.Errors) > 0 { return nil, errs } log.Println(common.ScrubConfig(builder.config, builder.config.AccessKey, builder.config.SecretKey)) return nil, nil }
func (p *Provisioner) Prepare(raws ...interface{}) error { md, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars if p.config.TempConfigDir == "" { p.config.TempConfigDir = DefaultTempConfigDir } // Accumulate any errors errs := common.CheckUnusedConfig(md) templates := map[string]*string{ "bootstrap_args": &p.config.BootstrapArgs, "minion_config": &p.config.MinionConfig, "local_state_tree": &p.config.LocalStateTree, "temp_config_dir": &p.config.TempConfigDir, } for n, ptr := range templates { var err error *ptr, err = p.config.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if p.config.LocalStateTree != "" { if _, err := os.Stat(p.config.LocalStateTree); err != nil { errs = packer.MultiErrorAppend(errs, errors.New("local_state_tree must exist and be accessible")) } } if p.config.MinionConfig != "" { if _, err := os.Stat(p.config.MinionConfig); err != nil { errs = packer.MultiErrorAppend(errs, errors.New("minion_config must exist and be accessible")) } } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
func (p *PostProcessor) prepare_config_template() error { tpl, err := packer.NewConfigTemplate() if err != nil { return err } tpl.UserVars = p.c.PackerUserVars p.tpl = tpl return nil }
func (c *AMIConfig) Prepare(t *packer.ConfigTemplate) []error { if t == nil { var err error t, err = packer.NewConfigTemplate() if err != nil { return []error{err} } } templates := map[string]*string{ "ami_name": &c.AMIName, "ami_description": &c.AMIDescription, } errs := make([]error, 0) for n, ptr := range templates { var err error *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } sliceTemplates := map[string][]string{ "ami_users": c.AMIUsers, "ami_groups": c.AMIGroups, "ami_product_codes": c.AMIProductCodes, } for n, slice := range sliceTemplates { for i, elem := range slice { var err error slice[i], err = t.Process(elem, nil) if err != nil { errs = append( errs, fmt.Errorf("Error processing %s[%d]: %s", n, i, err)) } } } if c.AMIName == "" { errs = append(errs, fmt.Errorf("ami_name must be specified")) } if len(errs) > 0 { return errs } return nil }
func (p *PostProcessor) configureSingle(config *Config, raws ...interface{}) error { md, err := common.DecodeConfig(config, raws...) if err != nil { return err } config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } config.tpl.UserVars = config.PackerUserVars // Defaults if config.OutputPath == "" { config.OutputPath = "packer_{{ .BuildName }}_{{.Provider}}.box" } found := false for _, k := range md.Keys { if k == "compression_level" { found = true break } } if !found { config.CompressionLevel = flate.DefaultCompression } // Accumulate any errors errs := common.CheckUnusedConfig(md) validates := map[string]*string{ "output": &config.OutputPath, "vagrantfile_template": &config.VagrantfileTemplate, "provider": &config.Provider, } for n, ptr := range validates { if err := config.tpl.Validate(*ptr); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error parsing %s: %s", n, err)) } } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
// This returns a mapstructure.DecodeHookFunc that automatically template // processes any configuration values that aren't strings but have been // provided as strings. // // For example: "image_id" wants an int and the user uses a string with // a user variable like "{{user `image_id`}}". This decode hook makes that // work. func decodeConfigHook(raws []interface{}) (mapstructure.DecodeHookFunc, error) { // First thing we do is decode PackerConfig so that we can have access // to the user variables so that we can process some templates. var pc PackerConfig decoderConfig := &mapstructure.DecoderConfig{ Result: &pc, WeaklyTypedInput: true, } decoder, err := mapstructure.NewDecoder(decoderConfig) if err != nil { return nil, err } for _, raw := range raws { if err := decoder.Decode(raw); err != nil { return nil, err } } tpl, err := packer.NewConfigTemplate() if err != nil { return nil, err } tpl.UserVars = pc.PackerUserVars return func(f reflect.Kind, t reflect.Kind, v interface{}) (interface{}, error) { if t != reflect.String { // We need to convert []uint8 to string. We have to do this // because internally Packer uses MsgPack for RPC and the MsgPack // codec turns strings into []uint8 if f == reflect.Slice { dataVal := reflect.ValueOf(v) dataType := dataVal.Type() elemKind := dataType.Elem().Kind() if elemKind == reflect.Uint8 { v = string(dataVal.Interface().([]uint8)) } } if sv, ok := v.(string); ok { var err error v, err = tpl.Process(sv, nil) if err != nil { return nil, err } } } return v, nil }, nil }
func (p *OVFPostProcessor) Configure(raws ...interface{}) error { _, err := common.DecodeConfig(&p.cfg, raws...) if err != nil { return err } p.cfg.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.cfg.tpl.UserVars = p.cfg.PackerUserVars if p.cfg.TargetType == "" { p.cfg.TargetType = "ovf" } if p.cfg.TargetPath == "" { p.cfg.TargetPath = "packer_{{ .BuildName }}_{{.Provider}}" if p.cfg.TargetType == "ova" { p.cfg.TargetPath += ".ova" } } errs := new(packer.MultiError) _, err = exec.LookPath(executable) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error: Could not find ovftool executable: %s", err)) } if err = p.cfg.tpl.Validate(p.cfg.TargetPath); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error parsing target template: %s", err)) } if !(p.cfg.TargetType == "ovf" || p.cfg.TargetType == "ova") { errs = packer.MultiErrorAppend( errs, errors.New("Invalid target type. Only 'ovf' or 'ova' are allowed.")) } if !(p.cfg.Compression >= 0 && p.cfg.Compression <= 9) { errs = packer.MultiErrorAppend( errs, errors.New("Invalid compression level. Must be between 1 and 9, or 0 for no compression.")) } if len(errs.Errors) > 0 { return errs } return nil }
func (p *PostProcessor) Configure(raws ...interface{}) error { _, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars // Default configuration if p.config.VagrantCloudUrl == "" { p.config.VagrantCloudUrl = VAGRANT_CLOUD_URL } // Accumulate any errors errs := new(packer.MultiError) // required configuration templates := map[string]*string{ "box_tag": &p.config.Tag, "version": &p.config.Version, "access_token": &p.config.AccessToken, } for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", key)) } } // Template process for key, ptr := range templates { *ptr, err = p.config.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", key, err)) } } if len(errs.Errors) > 0 { return errs } return nil }
func NewConfig(raws ...interface{}) (*Config, []string, error) { c := new(Config) md, err := common.DecodeConfig(c, raws...) if err != nil { return nil, nil, err } c.tpl, err = packer.NewConfigTemplate() if err != nil { return nil, nil, err } c.tpl.UserVars = c.PackerUserVars // Defaults if c.Port == 0 { c.Port = 22 } // (none so far) errs := common.CheckUnusedConfig(md) if c.Host == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("host must be specified")) } if c.SSHUsername == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("ssh_username must be specified")) } if c.SSHPassword == "" && c.SSHPrivateKeyFile == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("one of ssh_password and ssh_private_key_file must be specified")) } if c.SSHPassword != "" && c.SSHPrivateKeyFile != "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("only one of ssh_password and ssh_private_key_file must be specified")) } if errs != nil && len(errs.Errors) > 0 { return nil, nil, errs } return c, nil, nil }
func (b *Builder) Prepare(raws ...interface{}) error { md, err := common.DecodeConfig(&b.config, raws...) if err != nil { return err } b.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } b.config.tpl.UserVars = b.config.PackerUserVars // Accumulate any errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(b.config.tpl)...) // Accumulate any errors newTags := make(map[string]string) for k, v := range b.config.Tags { k, err = b.config.tpl.Process(k, nil) if err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Error processing tag key %s: %s", k, err)) continue } v, err = b.config.tpl.Process(v, nil) if err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Error processing tag value '%s': %s", v, err)) continue } newTags[k] = v } b.config.Tags = newTags if errs != nil && len(errs.Errors) > 0 { return errs } log.Printf("Config: %+v", b.config) return nil }
func (p *PostProcessor) Configure(raws ...interface{}) error { _, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } tpl, err := packer.NewConfigTemplate() if err != nil { return err } tpl.UserVars = p.config.PackerUserVars // Accumulate any errors errs := new(packer.MultiError) if _, err := exec.LookPath("ovftool"); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("ovftool not found: %s", err)) } validates := map[string]*string{ "datacenter": &p.config.Datacenter, "datastore": &p.config.Datastore, "host": &p.config.Host, "vm_network": &p.config.VMNetwork, "password": &p.config.Password, "path_to_resource_pool": &p.config.PathToResourcePool, "username": &p.config.Username, "vm_folder": &p.config.VMFolder, "vm_name": &p.config.VMName, } for n := range validates { if *validates[n] == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", n)) } } if len(errs.Errors) > 0 { return errs } return nil }
func (p *Provisioner) Prepare(raws ...interface{}) error { md, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars // Accumulate any errors errs := common.CheckUnusedConfig(md) templates := map[string]*string{ "source": &p.config.Source, "destination": &p.config.Destination, } for n, ptr := range templates { var err error *ptr, err = p.config.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if _, err := os.Stat(p.config.Source); err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Bad source '%s': %s", p.config.Source, err)) } if p.config.Destination == "" { errs = packer.MultiErrorAppend(errs, errors.New("Destination must be specified.")) } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
func (b *BlockDevices) Prepare(t *packer.ConfigTemplate) []error { if t == nil { var err error t, err = packer.NewConfigTemplate() if err != nil { return []error{err} } } lists := map[string][]BlockDevice{ "ami_block_device_mappings": b.AMIMappings, "launch_block_device_mappings": b.LaunchMappings, } var errs []error for outer, bds := range lists { for i := 0; i < len(bds); i++ { templates := map[string]*string{ "device_name": &bds[i].DeviceName, "snapshot_id": &bds[i].SnapshotId, "virtual_name": &bds[i].VirtualName, "volume_type": &bds[i].VolumeType, } errs := make([]error, 0) for n, ptr := range templates { var err error *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append( errs, fmt.Errorf( "Error processing %s[%d].%s: %s", outer, i, n, err)) } } } } if len(errs) > 0 { return errs } return nil }
func (c *AccessConfig) Prepare(t *packer.ConfigTemplate) []error { if t == nil { var err error t, err = packer.NewConfigTemplate() if err != nil { return []error{err} } } templates := map[string]*string{ "username": &c.Username, "password": &c.Password, "api_key": &c.ApiKey, "provider": &c.Provider, "project": &c.Project, "tenant_id": &c.TenantId, "region": &c.RawRegion, "proxy_url": &c.ProxyUrl, } errs := make([]error, 0) for n, ptr := range templates { var err error *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if strings.HasPrefix(c.Provider, "rackspace") { if c.Region() == "" { errs = append(errs, fmt.Errorf("region must be specified when using rackspace")) } } if len(errs) > 0 { return errs } return nil }
func (p *PostProcessor) Configure(raws ...interface{}) error { _, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars // Accumulate any errors errs := new(packer.MultiError) if len(errs.Errors) > 0 { return errs } return nil }
func (p *PostProcessor) Configure(raws ...interface{}) error { _, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars // Accumulate any errors errs := new(packer.MultiError) templates := map[string]*string{ "repository": &p.config.Repository, "tag": &p.config.Tag, } for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", key)) } *ptr, err = p.config.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", key, err)) } } if len(errs.Errors) > 0 { return errs } return nil }
func (p *PostProcessor) Configure(raws ...interface{}) error { _, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } p.config.tpl, err = packer.NewConfigTemplate() if err != nil { return err } p.config.tpl.UserVars = p.config.PackerUserVars // Accumulate any errors errs := new(packer.MultiError) // Process templates templates := map[string]*string{ "login_email": &p.config.LoginEmail, "login_username": &p.config.LoginUsername, "login_password": &p.config.LoginPassword, "login_server": &p.config.LoginServer, } for n, ptr := range templates { var err error *ptr, err = p.config.tpl.Process(*ptr, nil) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if len(errs.Errors) > 0 { return errs } return nil }