func (b *Builder) Prepare(raws ...interface{}) error { md, err := common.DecodeConfig(&b.config, raws...) if err != nil { return err } // Accumulate any errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare()...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare()...) // Accumulate any errors if b.config.AMIName == "" { errs = packer.MultiErrorAppend( errs, errors.New("ami_name must be specified")) } else { _, err = template.New("ami").Parse(b.config.AMIName) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Failed parsing ami_name: %s", err)) } } if errs != nil && len(errs.Errors) > 0 { return errs } log.Printf("Config: %+v", b.config) return 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 (p *Provisioner) Prepare(raws ...interface{}) error { md, err := common.DecodeConfig(&p.config, raws...) if err != nil { return err } if p.config.TempConfigDir == "" { p.config.TempConfigDir = DefaultTempConfigDir } // Accumulate any errors errs := common.CheckUnusedConfig(md) if p.config.LocalStateTree == "" { errs = packer.MultiErrorAppend(errs, errors.New("Please specify a local_state_tree")) } else if _, err := os.Stat(p.config.LocalStateTree); err != nil { errs = packer.MultiErrorAppend(errs, errors.New("local_state_tree must exist and be accessible")) } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
func (p *PostProcessor) Configure(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } // Defaults if p.config.RemoveEthernet == "" { p.config.RemoveEthernet = "false" } if p.config.RemoveFloppy == "" { p.config.RemoveFloppy = "false" } if p.config.RemoveOpticalDrive == "" { p.config.RemoveOpticalDrive = "false" } if p.config.VirtualHardwareVer == "" { p.config.VirtualHardwareVer = "10" } // 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)) } // First define all our templatable parameters that are _required_ templates := map[string]*string{ "datacenter": &p.config.Datacenter, "host": &p.config.Host, "password": &p.config.Password, "username": &p.config.Username, "datastore": &p.config.Datastore, "vm_folder": &p.config.VMFolder, } for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", key)) } } if len(errs.Errors) > 0 { return errs } return nil }
func NewConfig(raws ...interface{}) (*Config, []string, error) { c := new(Config) warnings := []string{} err := config.Decode(c, &config.DecodeOpts{ Interpolate: true, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return nil, warnings, err } var errs *packer.MultiError if c.Target == "" { errs = packer.MultiErrorAppend(errs, ErrTargetRequired) } if c.Content == "" && c.Source == "" { warnings = append(warnings, "Both source file and contents are blank; target will have no content") } if c.Content != "" && c.Source != "" { errs = packer.MultiErrorAppend(errs, ErrContentSourceConflict) } if errs != nil && len(errs.Errors) > 0 { return nil, warnings, errs } return c, warnings, nil }
func (p *PostProcessor) Configure(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } // Accumulate any errors errs := new(packer.MultiError) if p.config.Template == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Template must be set")) } if p.config.Output == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Output must be set")) } log.Printf("Configure(): template:%s output:%s", p.config.Template, p.config.Output) if 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 (p *Provisioner) Prepare(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } if p.config.Direction == "" { p.config.Direction = "upload" } var errs *packer.MultiError if p.config.Direction != "download" && p.config.Direction != "upload" { errs = packer.MultiErrorAppend(errs, errors.New("Direction must be one of: download, upload.")) } 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 (p *Provisioner) Prepare(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } var errs *packer.MultiError 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 (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 (p *PostProcessor) Configure(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } errs := &packer.MultiError{} errs = packer.MultiErrorAppend(errs, p.config.AccessConfig.Prepare(&p.config.ctx)...) // required configuration templates := map[string]*string{ "region": &p.config.Region, "bucket": &p.config.Bucket, "manifest": &p.config.ManifestPath, "box_name": &p.config.BoxName, "box_dir": &p.config.BoxDir, "version": &p.config.Version, } // Template process for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", key)) } *ptr, err = interpolate.Render(*ptr, &p.config.ctx) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", key, err)) } } // setup the s3 bucket auth, err := aws.GetAuth(p.config.AccessConfig.AccessKey, p.config.AccessConfig.SecretKey) if err != nil { errs = packer.MultiErrorAppend(errs, err) } // determine region region, valid := aws.Regions[p.config.Region] if valid { p.s3 = s3.New(auth, region).Bucket(p.config.Bucket) } else { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Invalid region specified: %s", p.config.Region)) } if len(errs.Errors) > 0 { return errs } return nil }
func (p *PostProcessor) Configure(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{"output"}, }, }, raws...) if err != nil { return err } errs := new(packer.MultiError) // required configuration templates := map[string]*string{ "region": &p.config.Region, "bucket": &p.config.Bucket, "manifest": &p.config.ManifestPath, "box_name": &p.config.BoxName, "box_dir": &p.config.BoxDir, "version": &p.config.Version, } for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("vagrant-s3 %s must be set", key)) } } // Template process for key, ptr := range templates { if err = interpolate.Validate(*ptr, &p.config.ctx); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error parsing %s template: %s", key, err)) } } auth, err := aws.GetAuth(p.config.AccessKey, p.config.SecretKey) if err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Unable to create Aws Authentication. Try providing keys 'access_key_id' and 'secret_key'")) } // determine region region, valid := aws.Regions[p.config.Region] if valid { p.s3 = s3.New(auth, region).Bucket(p.config.Bucket) } else { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Invalid region specified: %s", p.config.Region)) } if p.config.ACL == "" { p.config.ACL = "public-read" } if 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 // 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 (p *PostProcessor) Configure(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) errs := new(packer.MultiError) // If there is no explicit number of Go threads to use, then set it if os.Getenv("GOMAXPROCS") == "" { runtime.GOMAXPROCS(runtime.NumCPU()) } if p.config.OutputPath == "" { p.config.OutputPath = "packer_{{.BuildName}}_{{.Provider}}" } if err = interpolate.Validate(p.config.OutputPath, &p.config.ctx); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error parsing target template: %s", err)) } templates := map[string]*string{ "output": &p.config.OutputPath, } if p.config.CompressionLevel > pgzip.BestCompression { p.config.CompressionLevel = pgzip.BestCompression } // Technically 0 means "don't compress" but I don't know how to // differentiate between "user entered zero" and "user entered nothing". // Also, why bother creating a compressed file with zero compression? if p.config.CompressionLevel == -1 || p.config.CompressionLevel == 0 { p.config.CompressionLevel = pgzip.DefaultCompression } for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", key)) } *ptr, err = interpolate.Render(p.config.OutputPath, &p.config.ctx) if err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error processing %s: %s", key, err)) } } p.config.detectFromFilename() 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 // 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 (p *Provisioner) Prepare(raws ...interface{}) error { p.done = make(chan struct{}) err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } // Defaults if p.config.Command == "" { p.config.Command = "ansible-playbook" } if p.config.HostAlias == "" { p.config.HostAlias = "default" } var errs *packer.MultiError err = validateFileConfig(p.config.PlaybookFile, "playbook_file", true) if err != nil { errs = packer.MultiErrorAppend(errs, err) } // Check that the authorized key file exists if len(p.config.SSHAuthorizedKeyFile) > 0 { err = validateFileConfig(p.config.SSHAuthorizedKeyFile, "ssh_authorized_key_file", true) if err != nil { log.Println(p.config.SSHAuthorizedKeyFile, "does not exist") errs = packer.MultiErrorAppend(errs, err) } } if len(p.config.SSHHostKeyFile) > 0 { err = validateFileConfig(p.config.SSHHostKeyFile, "ssh_host_key_file", true) if err != nil { log.Println(p.config.SSHHostKeyFile, "does not exist") errs = packer.MultiErrorAppend(errs, err) } } if len(p.config.LocalPort) > 0 { if _, err := strconv.ParseUint(p.config.LocalPort, 10, 16); err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("local_port: %s must be a valid port", p.config.LocalPort)) } } else { p.config.LocalPort = "0" } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
func (p *Provisioner) Prepare(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{ "execute_command", }, }, }, raws...) if err != nil { return err } if p.config.ExecuteCommand == "" { p.config.ExecuteCommand = p.commandTemplate() } if p.config.StagingDir == "" { p.config.StagingDir = "/tmp/packer-puppet-server" } if p.config.Facter == nil { p.config.Facter = make(map[string]string) } p.config.Facter["packer_build_name"] = p.config.PackerBuildName p.config.Facter["packer_builder_type"] = p.config.PackerBuilderType var errs *packer.MultiError if p.config.ClientCertPath != "" { info, err := os.Stat(p.config.ClientCertPath) if err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("client_cert_dir is invalid: %s", err)) } else if !info.IsDir() { errs = packer.MultiErrorAppend(errs, fmt.Errorf("client_cert_dir must point to a directory")) } } if p.config.ClientPrivateKeyPath != "" { info, err := os.Stat(p.config.ClientPrivateKeyPath) if err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("client_private_key_dir is invalid: %s", err)) } else if !info.IsDir() { errs = packer.MultiErrorAppend(errs, fmt.Errorf("client_private_key_dir must point to a directory")) } } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }
func (p *HostCommandProvisioner) Prepare(raw ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{ "execute_command", }, }, }, raw...) if err != nil { return err } var errs *packer.MultiError if p.config.ExecuteCommand == "" { p.config.ExecuteCommand = "{{ .Command }}" } if p.config.Commands == nil { p.config.Commands = make([]string, 0) } if p.config.Vars == nil { p.config.Vars = make([]string, 0) } if p.config.Command != "" && len(p.config.Commands) > 0 { errs = packer.MultiErrorAppend(errs, errors.New("You cannot specify both command and commands")) } if p.config.Command != "" { p.config.Commands = []string{p.config.Command} } // Sanity check if len(p.config.Commands) == 0 { errs = packer.MultiErrorAppend(errs, errors.New("You must specify a command")) } // Check for bad env vars (i.e. '=foo' and 'foobar') for _, keyValStr := range p.config.Vars { keyValPair := strings.SplitN(keyValStr, "=", 2) if len(keyValPair) != 2 || keyValPair[0] == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Environment variable not in 'key=value' format: %s", keyValStr)) } } if errs != nil && 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 { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } if p.config.TempConfigDir == "" { p.config.TempConfigDir = DefaultTempConfigDir } if p.config.RemoteStateTree == "" { p.config.RemoteStateTree = DefaultStateTreeDir } if p.config.RemotePillarRoots == "" { p.config.RemotePillarRoots = DefaultPillarRootDir } var errs *packer.MultiError // require a salt state tree if p.config.LocalStateTree == "" { errs = packer.MultiErrorAppend(errs, errors.New("local_state_tree must be supplied")) } else { 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.LocalPillarRoots != "" { if _, err := os.Stat(p.config.LocalPillarRoots); err != nil { errs = packer.MultiErrorAppend(errs, errors.New("local_pillar_roots 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 NewConfig(raws ...interface{}) (*Config, []string, error) { c := new(Config) err := config.Decode(c, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &c.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{ "boot_command", "tools_upload_path", }, }, }, raws...) if err != nil { return nil, nil, err } // Defaults if c.VMName == "" { c.VMName = fmt.Sprintf("packer-%s-{{timestamp}}", c.PackerBuildName) } // Prepare the errors var errs *packer.MultiError errs = packer.MultiErrorAppend(errs, c.DriverConfig.Prepare(&c.ctx)...) errs = packer.MultiErrorAppend(errs, c.HTTPConfig.Prepare(&c.ctx)...) errs = packer.MultiErrorAppend(errs, c.OutputConfig.Prepare(&c.ctx, &c.PackerConfig)...) errs = packer.MultiErrorAppend(errs, c.RunConfig.Prepare(&c.ctx)...) errs = packer.MultiErrorAppend(errs, c.ShutdownConfig.Prepare(&c.ctx)...) errs = packer.MultiErrorAppend(errs, c.SSHConfig.Prepare(&c.ctx)...) errs = packer.MultiErrorAppend(errs, c.ToolsConfig.Prepare(&c.ctx)...) errs = packer.MultiErrorAppend(errs, c.VMXConfig.Prepare(&c.ctx, c.RemoteType)...) if c.SourcePath == "" { errs = packer.MultiErrorAppend(errs, fmt.Errorf("source_path is blank, but is required")) } else { if _, err := os.Stat(c.SourcePath); err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("source_path is invalid: %s", err)) } } // Warnings var warnings []string if c.ShutdownCommand == "" { warnings = append(warnings, "A shutdown_command was not specified. Without a shutdown command, Packer\n"+ "will forcibly halt the virtual machine, which may result in data loss.") } // Check for any errors. if errs != nil && len(errs.Errors) > 0 { return nil, warnings, errs } return c, warnings, 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 (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 // 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 (p *OVFPostProcessor) Configure(raws ...interface{}) error { err := config.Decode(&p.cfg, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.cfg.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } 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 = interpolate.Validate(p.cfg.TargetPath, &p.cfg.ctx); 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 := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } if p.config.UploadTimer == 0 { p.config.UploadTimer = 1200 } // Accumulate any errors errs := new(packer.MultiError) // First define all our templatable parameters that are _required_ templates := map[string]*string{ "apiurl": &p.config.ApiUrl, "apikey": &p.config.ApiKey, "secret": &p.config.Secret, "display_text": &p.config.DisplayText, "template_name": &p.config.TemplateName, "os_type": &p.config.OsType, "download_url": &p.config.DownloadUrl, "zone": &p.config.Zone, } for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", key)) } } // Then define the ones that are optional if p.config.Account != "" && p.config.Domain == "" { errs = packer.MultiErrorAppend( errs, errors.New("If the account is specified, the domain must also be specified.")) } if len(errs.Errors) > 0 { return errs } return nil }
func (p *Provisioner) Prepare(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{}, }, }, raws...) if err != nil { return err } if p.config.Direction == "" { p.config.Direction = "upload" } var errs *packer.MultiError if p.config.Direction != "download" && p.config.Direction != "upload" { errs = packer.MultiErrorAppend(errs, errors.New("Direction must be one of: download, upload.")) } if p.config.Source != "" { p.config.Sources = append(p.config.Sources, p.config.Source) } if p.config.Direction == "upload" { for _, src := range p.config.Sources { if _, err := os.Stat(src); err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Bad source '%s': %s", src, err)) } } } if len(p.config.Sources) < 1 { errs = packer.MultiErrorAppend(errs, errors.New("Source must be specified.")) } 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 (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 }
// Entry point for configuration parisng when we've defined func (p *PostProcessor) Configure(raws ...interface{}) error { p.config.ctx.Funcs = awscommon.TemplateFuncs err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, InterpolateFilter: &interpolate.RenderFilter{ Exclude: []string{ "s3_key_name", }, }, }, raws...) if err != nil { return err } // Set defaults if p.config.S3Key == "" { p.config.S3Key = "packer-import-{{timestamp}}.ova" } errs := new(packer.MultiError) // Check and render s3_key_name if err = interpolate.Validate(p.config.S3Key, &p.config.ctx); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("Error parsing s3_key_name template: %s", err)) } // Check we have AWS access variables defined somewhere errs = packer.MultiErrorAppend(errs, p.config.AccessConfig.Prepare(&p.config.ctx)...) // define all our required paramaters templates := map[string]*string{ "s3_bucket_name": &p.config.S3Bucket, } // Check out required params are defined for key, ptr := range templates { if *ptr == "" { errs = packer.MultiErrorAppend( errs, fmt.Errorf("%s must be set", key)) } } // Anything which flagged return back up the stack if len(errs.Errors) > 0 { return errs } log.Println(common.ScrubConfig(p.config, p.config.AccessKey, p.config.SecretKey)) return nil }
func (p *Provisioner) Prepare(raws ...interface{}) error { err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, }, raws...) if err != nil { return err } // Defaults if p.config.Inline != nil && len(p.config.Inline) == 0 { p.config.Inline = nil } if p.config.DistrDstPath == "" { p.config.DistrDstPath = DistrDstPathDefault } // Accumulate any errors var errs *packer.MultiError log.Println(fmt.Sprintf("%s: %v", "inline", p.config.Inline)) log.Println(fmt.Sprintf("%s: %v", "script_path", p.config.ScriptPath)) log.Println(fmt.Sprintf("%s: %v", "distr_src_path", p.config.DistrSrcPath)) log.Println(fmt.Sprintf("%s: %v", "distr_dst_dir_path", p.config.DistrDstPath)) if p.config.ScriptPath == "" && p.config.Inline == nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("one of script_path or inline must be specified")) } if p.config.ScriptPath != "" { if _, err := os.Stat(p.config.ScriptPath); err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("script_path is not a valid path: %v", err)) } } if p.config.DistrSrcPath != "" { if _, err := os.Stat(p.config.DistrSrcPath); err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("distr_src_path is not a valid path: %v", err)) } } if errs != nil && len(errs.Errors) > 0 { return errs } return nil }