func (c *ShutdownConfig) Prepare(t *packer.ConfigTemplate) []error { if c.RawShutdownTimeout == "" { c.RawShutdownTimeout = "5m" } templates := map[string]*string{ "shutdown_command": &c.ShutdownCommand, "shutdown_timeout": &c.RawShutdownTimeout, } 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)) } } var err error c.ShutdownTimeout, err = time.ParseDuration(c.RawShutdownTimeout) if err != nil { errs = append(errs, fmt.Errorf("Failed parsing shutdown_timeout: %s", err)) } return errs }
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 *OutputConfig) Prepare(t *packer.ConfigTemplate, pc *common.PackerConfig) []error { if c.OutputDir == "" { c.OutputDir = fmt.Sprintf("output-%s", pc.PackerBuildName) } templates := map[string]*string{ "output_directory": &c.OutputDir, } 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 !pc.PackerForce { if _, err := os.Stat(c.OutputDir); err == nil { errs = append(errs, fmt.Errorf( "Output directory '%s' already exists. It must not exist.", c.OutputDir)) } } return errs }
func (c *RunConfig) Prepare(t *packer.ConfigTemplate) []error { if c.RawBootWait == "" { c.RawBootWait = "10s" } templates := map[string]*string{ "boot_wait": &c.RawBootWait, } 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)) } } var err error c.BootWait, err = time.ParseDuration(c.RawBootWait) if err != nil { errs = append(errs, fmt.Errorf("Failed parsing boot_wait: %s", err)) } return errs }
func (c *VMXConfig) Prepare(t *packer.ConfigTemplate) []error { errs := make([]error, 0) newVMXData := make(map[string]string) for k, v := range c.VMXData { var err error k, err = t.Process(k, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing VMX data key %s: %s", k, err)) continue } v, err = t.Process(v, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing VMX data value '%s': %s", v, err)) continue } newVMXData[k] = v } c.VMXData = newVMXData return errs }
func (c *ExportConfig) Prepare(t *packer.ConfigTemplate) []error { if c.Format == "" { c.Format = "ovf" } templates := map[string]*string{ "format": &c.Format, } 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.Format != "ovf" && c.Format != "ova" { errs = append(errs, errors.New("invalid format, only 'ovf' or 'ova' are allowed")) } return errs }
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 (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 (c *SSHConfig) Prepare(t *packer.ConfigTemplate) []error { if c.SSHHostPortMin == 0 { c.SSHHostPortMin = 2222 } if c.SSHHostPortMax == 0 { c.SSHHostPortMax = 4444 } if c.SSHPort == 0 { c.SSHPort = 22 } if c.RawSSHWaitTimeout == "" { c.RawSSHWaitTimeout = "20m" } templates := map[string]*string{ "ssh_key_path": &c.SSHKeyPath, "ssh_password": &c.SSHPassword, "ssh_username": &c.SSHUser, "ssh_wait_timeout": &c.RawSSHWaitTimeout, } 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.SSHKeyPath != "" { if _, err := os.Stat(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } else if _, err := sshKeyToKeyring(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } } if c.SSHHostPortMin > c.SSHHostPortMax { errs = append(errs, errors.New("ssh_host_port_min must be less than ssh_host_port_max")) } if c.SSHUser == "" { errs = append(errs, errors.New("An ssh_username must be specified.")) } var err error c.SSHWaitTimeout, err = time.ParseDuration(c.RawSSHWaitTimeout) if err != nil { errs = append(errs, fmt.Errorf("Failed parsing ssh_wait_timeout: %s", err)) } return errs }
func (c *RunConfig) Prepare(t *packer.ConfigTemplate) []error { if c.RawBootWait == "" { c.RawBootWait = "10s" } if c.HTTPPortMin == 0 { c.HTTPPortMin = 8000 } if c.HTTPPortMax == 0 { c.HTTPPortMax = 9000 } if c.VNCPortMin == 0 { c.VNCPortMin = 5900 } if c.VNCPortMax == 0 { c.VNCPortMax = 6000 } templates := map[string]*string{ "boot_wait": &c.RawBootWait, "http_directory": &c.HTTPDir, } var err error errs := make([]error, 0) for n, ptr := range templates { *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if c.RawBootWait != "" { c.BootWait, err = time.ParseDuration(c.RawBootWait) if err != nil { errs = append( errs, fmt.Errorf("Failed parsing boot_wait: %s", err)) } } if c.HTTPPortMin > c.HTTPPortMax { errs = append(errs, errors.New("http_port_min must be less than http_port_max")) } if c.VNCPortMin > c.VNCPortMax { errs = append( errs, fmt.Errorf("vnc_port_min must be less than vnc_port_max")) } return errs }
func (c *ToolsConfig) Prepare(t *packer.ConfigTemplate) []error { if c.ParallelsToolsMode == "" { c.ParallelsToolsMode = ParallelsToolsModeUpload } if c.ParallelsToolsGuestPath == "" { c.ParallelsToolsGuestPath = "prl-tools-{{.Flavor}}.iso" } templates := map[string]*string{ "parallels_tools_flavor": &c.ParallelsToolsFlavor, "parallels_tools_mode": &c.ParallelsToolsMode, } var err error errs := make([]error, 0) for n, ptr := range templates { *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if _, err := template.New("path").Parse(c.ParallelsToolsGuestPath); err != nil { errs = append(errs, fmt.Errorf("parallels_tools_guest_path invalid: %s", err)) } validMode := false validModes := []string{ ParallelsToolsModeDisable, ParallelsToolsModeAttach, ParallelsToolsModeUpload, } for _, mode := range validModes { if c.ParallelsToolsMode == mode { validMode = true break } } if !validMode { errs = append(errs, fmt.Errorf("parallels_tools_mode is invalid. Must be one of: %v", validModes)) } if c.ParallelsToolsFlavor == "" { if c.ParallelsToolsMode != ParallelsToolsModeDisable { errs = append(errs, errors.New("parallels_tools_flavor must be specified.")) } } return errs }
func (c *SSHConfig) Prepare(t *packer.ConfigTemplate) []error { if c.SSHPort == 0 { c.SSHPort = 22 } if c.RawSSHWaitTimeout == "" { c.RawSSHWaitTimeout = "20m" } templates := map[string]*string{ "ssh_host": &c.SSHHost, "ssh_key_path": &c.SSHKeyPath, "ssh_password": &c.SSHPassword, "ssh_username": &c.SSHUser, "ssh_wait_timeout": &c.RawSSHWaitTimeout, } 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.SSHKeyPath != "" { if _, err := os.Stat(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } else if _, err := commonssh.FileSigner(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } } if c.SSHHost != "" { if ip := net.ParseIP(c.SSHHost); ip == nil { if _, err := net.LookupHost(c.SSHHost); err != nil { errs = append(errs, errors.New("ssh_host is an invalid IP or hostname")) } } } if c.SSHUser == "" { errs = append(errs, errors.New("An ssh_username must be specified.")) } var err error c.SSHWaitTimeout, err = time.ParseDuration(c.RawSSHWaitTimeout) if err != nil { errs = append(errs, fmt.Errorf("Failed parsing ssh_wait_timeout: %s", err)) } return errs }
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 (c *ExportOpts) Prepare(t *packer.ConfigTemplate) []error { if c.ExportOpts == nil { c.ExportOpts = make([]string, 0) } errs := make([]error, 0) for i, str := range c.ExportOpts { var err error c.ExportOpts[i], err = t.Process(str, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing %s: %s", "export_opts", err)) } } return errs }
func (c *FloppyConfig) Prepare(t *packer.ConfigTemplate) []error { if c.FloppyFiles == nil { c.FloppyFiles = make([]string, 0) } errs := make([]error, 0) for i, file := range c.FloppyFiles { var err error c.FloppyFiles[i], err = t.Process(file, nil) if err != nil { errs = append(errs, fmt.Errorf( "Error processing floppy_files[%d]: %s", i, err)) } } return errs }
func (c *WinRMConfig) Prepare(t *packer.ConfigTemplate) []error { if c.WinRMPort == 0 { c.WinRMPort = 5985 } if c.RawWinRMWaitTimeout == "" { c.RawWinRMWaitTimeout = "20m" } templates := map[string]*string{ "winrm_password": &c.WinRMPassword, "winrm_username": &c.WinRMUser, "winrm_wait_timeout": &c.RawWinRMWaitTimeout, } 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.WinRMHost != "" { if ip := net.ParseIP(c.WinRMHost); ip == nil { if _, err := net.LookupHost(c.WinRMHost); err != nil { errs = append(errs, errors.New("winrm_host is an invalid IP or hostname")) } } } if c.WinRMUser == "" { errs = append(errs, errors.New("winrm_username must be specified.")) } var err error c.WinRMWaitTimeout, err = time.ParseDuration(c.RawWinRMWaitTimeout) if err != nil { errs = append(errs, fmt.Errorf("Failed parsing winrm_wait_timeout: %s", err)) } return errs }
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 (c *VBoxVersionConfig) Prepare(t *packer.ConfigTemplate) []error { if c.VBoxVersionFile == "" { c.VBoxVersionFile = ".vbox_version" } templates := map[string]*string{ "virtualbox_version_file": &c.VBoxVersionFile, } 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)) } } return errs }
func (c *DriverConfig) Prepare(t *packer.ConfigTemplate) []error { if c.FusionAppPath == "" { c.FusionAppPath = "/Applications/VMware Fusion.app" } templates := map[string]*string{ "fusion_app_path": &c.FusionAppPath, } var err error errs := make([]error, 0) for n, ptr := range templates { *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing %s: %s", n, err)) } } return errs }
func processArgs(args [][]string, tpl *packer.ConfigTemplate, tplData *qemuArgsTemplateData) ([][]string, error) { var err error if args == nil { return make([][]string, 0), err } newArgs := make([][]string, len(args)) for argsIdx, rowArgs := range args { parms := make([]string, len(rowArgs)) newArgs[argsIdx] = parms for i, parm := range rowArgs { parms[i], err = tpl.Process(parm, &tplData) if err != nil { return nil, err } } } return newArgs, err }
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{ "access_key": &c.AccessKey, "secret_key": &c.SecretKey, "region": &c.RawRegion, } 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 != "" { if _, ok := aws.Regions[c.RawRegion]; !ok { errs = append(errs, fmt.Errorf("Unknown region: %s", c.RawRegion)) } } if len(errs) > 0 { return errs } return nil }
func (c *ToolsConfig) Prepare(t *packer.ConfigTemplate) []error { if c.ToolsUploadPath == "" { c.ToolsUploadPath = "{{ .Flavor }}.iso" } templates := map[string]*string{ "tools_upload_flavor": &c.ToolsUploadFlavor, } var err error errs := make([]error, 0) for n, ptr := range templates { *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing %s: %s", n, err)) } } if _, err := template.New("path").Parse(c.ToolsUploadPath); err != nil { errs = append(errs, fmt.Errorf("tools_upload_path invalid: %s", err)) } return errs }
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.SSHPort == 0 { c.SSHPort = 22 } if c.RawSSHTimeout == "" { c.RawSSHTimeout = "5m" } if c.TemporaryKeyPairName == "" { c.TemporaryKeyPairName = "packer {{uuid}}" } // Validation var err error errs := make([]error, 0) if c.SourceAmi == "" { errs = append(errs, errors.New("A source_ami must be specified")) } if c.InstanceType == "" { errs = append(errs, errors.New("An instance_type must be specified")) } if c.SSHUsername == "" { errs = append(errs, errors.New("An ssh_username must be specified")) } if c.UserData != "" && c.UserDataFile != "" { errs = append(errs, fmt.Errorf("Only one of user_data or user_data_file can be specified.")) } else if c.UserDataFile != "" { if _, err := os.Stat(c.UserDataFile); err != nil { errs = append(errs, fmt.Errorf("user_data_file not found: %s", c.UserDataFile)) } } if c.SecurityGroupId != "" { if len(c.SecurityGroupIds) > 0 { errs = append(errs, fmt.Errorf("Only one of security_group_id or security_group_ids can be specified.")) } else { c.SecurityGroupIds = []string{c.SecurityGroupId} c.SecurityGroupId = "" } } templates := map[string]*string{ "iam_instance_profile": &c.IamInstanceProfile, "instance_type": &c.InstanceType, "ssh_timeout": &c.RawSSHTimeout, "ssh_username": &c.SSHUsername, "ssh_private_key_file": &c.SSHPrivateKeyFile, "source_ami": &c.SourceAmi, "subnet_id": &c.SubnetId, "temporary_key_pair_name": &c.TemporaryKeyPairName, "vpc_id": &c.VpcId, "availability_zone": &c.AvailabilityZone, } 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{ "security_group_ids": c.SecurityGroupIds, } 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)) } } } newTags := make(map[string]string) for k, v := range c.RunTags { k, err := t.Process(k, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing tag key %s: %s", k, err)) continue } v, err := t.Process(v, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing tag value '%s': %s", v, err)) continue } newTags[k] = v } c.RunTags = newTags c.sshTimeout, err = time.ParseDuration(c.RawSSHTimeout) if err != nil { errs = append(errs, fmt.Errorf("Failed parsing ssh_timeout: %s", err)) } return errs }
func (c *RunConfig) 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{ "iam_instance_profile": &c.IamInstanceProfile, "instance_type": &c.InstanceType, "spot_price": &c.SpotPrice, "spot_price_auto_product": &c.SpotPriceAutoProduct, "source_ami": &c.SourceAmi, "subnet_id": &c.SubnetId, "vpc_id": &c.VpcId, "availability_zone": &c.AvailabilityZone, "user_data": &c.UserData, "user_data_file": &c.UserDataFile, "security_group_id": &c.SecurityGroupId, } 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)) } } // Validation if c.SourceAmi == "" { errs = append(errs, errors.New("A source_ami must be specified")) } if c.InstanceType == "" { errs = append(errs, errors.New("An instance_type must be specified")) } if c.SpotPrice == "auto" { if c.SpotPriceAutoProduct == "" { errs = append(errs, errors.New( "spot_price_auto_product must be specified when spot_price is auto")) } } if c.UserData != "" && c.UserDataFile != "" { errs = append(errs, fmt.Errorf("Only one of user_data or user_data_file can be specified.")) } else if c.UserDataFile != "" { if _, err := os.Stat(c.UserDataFile); err != nil { errs = append(errs, fmt.Errorf("user_data_file not found: %s", c.UserDataFile)) } } if c.SecurityGroupId != "" { if len(c.SecurityGroupIds) > 0 { errs = append(errs, fmt.Errorf("Only one of security_group_id or security_group_ids can be specified.")) } else { c.SecurityGroupIds = []string{c.SecurityGroupId} c.SecurityGroupId = "" } } sliceTemplates := map[string][]string{ "security_group_ids": c.SecurityGroupIds, } 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)) } } } newTags := make(map[string]string) for k, v := range c.RunTags { k, err := t.Process(k, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing tag key %s: %s", k, err)) continue } v, err := t.Process(v, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing tag value '%s': %s", v, err)) continue } newTags[k] = v } c.RunTags = newTags return errs }
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, "ami_virtualization_type": &c.AMIVirtType, } 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, "ami_regions": c.AMIRegions, } 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(c.AMIRegions) > 0 { regionSet := make(map[string]struct{}) regions := make([]string, 0, len(c.AMIRegions)) for _, region := range c.AMIRegions { // If we already saw the region, then don't look again if _, ok := regionSet[region]; ok { continue } // Mark that we saw the region regionSet[region] = struct{}{} // Verify the region is real if _, ok := aws.Regions[region]; !ok { errs = append(errs, fmt.Errorf("Unknown region: %s", region)) continue } regions = append(regions, region) } c.AMIRegions = regions } newTags := make(map[string]string) for k, v := range c.AMITags { k, err := t.Process(k, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing tag key %s: %s", k, err)) continue } v, err := t.Process(v, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing tag value '%s': %s", v, err)) continue } newTags[k] = v } c.AMITags = newTags 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.SSHPort == 0 { c.SSHPort = 22 } if c.RawSSHTimeout == "" { c.RawSSHTimeout = "1m" } if c.TemporaryKeyPairName == "" { c.TemporaryKeyPairName = "packer {{uuid}}" } // Validation var err error errs := make([]error, 0) if c.SourceAmi == "" { errs = append(errs, errors.New("A source_ami must be specified")) } if c.InstanceType == "" { errs = append(errs, errors.New("An instance_type must be specified")) } if c.SSHUsername == "" { errs = append(errs, errors.New("An ssh_username must be specified")) } if c.UserData != "" && c.UserDataFile != "" { errs = append(errs, fmt.Errorf("Only one of user_data or user_data_file can be specified.")) } else if c.UserDataFile != "" { if _, err := os.Stat(c.UserDataFile); err != nil { errs = append(errs, fmt.Errorf("user_data_file not found: %s", c.UserDataFile)) } } templates := map[string]*string{ "iam_instance_profile": &c.IamInstanceProfile, "instance_type": &c.InstanceType, "ssh_timeout": &c.RawSSHTimeout, "security_group_id": &c.SecurityGroupId, "ssh_username": &c.SSHUsername, "source_ami": &c.SourceAmi, "subnet_id": &c.SubnetId, "temporary_key_pair_name": &c.TemporaryKeyPairName, "vpc_id": &c.VpcId, } 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 (c *CommonConfig) Prepare(t *packer.ConfigTemplate, pc *common.PackerConfig) []error { var err error // Set default values if c.HostPortMin == 0 { c.HostPortMin = 5900 } if c.HostPortMax == 0 { c.HostPortMax = 6000 } if c.RawBootWait == "" { c.RawBootWait = "5s" } if c.ToolsIsoName == "" { c.ToolsIsoName = "xs-tools.iso" } if c.HTTPPortMin == 0 { c.HTTPPortMin = 8000 } if c.HTTPPortMax == 0 { c.HTTPPortMax = 9000 } if c.RawSSHWaitTimeout == "" { c.RawSSHWaitTimeout = "200m" } if c.FloppyFiles == nil { c.FloppyFiles = make([]string, 0) } /* if c.SSHHostPortMin == 0 { c.SSHHostPortMin = 2222 } if c.SSHHostPortMax == 0 { c.SSHHostPortMax = 4444 } */ if c.SSHPort == 0 { c.SSHPort = 22 } if c.RawSSHWaitTimeout == "" { c.RawSSHWaitTimeout = "20m" } if c.OutputDir == "" { c.OutputDir = fmt.Sprintf("output-%s", pc.PackerBuildName) } if c.VMName == "" { c.VMName = fmt.Sprintf("packer-%s-{{timestamp}}", pc.PackerBuildName) } if c.Format == "" { c.Format = "xva" } if c.KeepVM == "" { c.KeepVM = "never" } if c.IPGetter == "" { c.IPGetter = "auto" } // Template substitution templates := map[string]*string{ "remote_username": &c.Username, "remote_password": &c.Password, "remote_host": &c.HostIp, "vm_name": &c.VMName, "vm_description": &c.VMDescription, "sr_name": &c.SrName, "shutdown_command": &c.ShutdownCommand, "boot_wait": &c.RawBootWait, "tools_iso_name": &c.ToolsIsoName, "http_directory": &c.HTTPDir, "ssh_key_path": &c.SSHKeyPath, "ssh_password": &c.SSHPassword, "ssh_username": &c.SSHUser, "ssh_wait_timeout": &c.RawSSHWaitTimeout, "output_directory": &c.OutputDir, "format": &c.Format, "keep_vm": &c.KeepVM, "ip_getter": &c.IPGetter, } for i := range c.FloppyFiles { templates[fmt.Sprintf("floppy_files[%d]", i)] = &c.FloppyFiles[i] } errs := make([]error, 0) for n, ptr := range templates { *ptr, err = t.Process(*ptr, nil) if err != nil { errs = append(errs, fmt.Errorf("Error processing %s: %s", n, err)) } } // Validation if c.Username == "" { errs = append(errs, errors.New("remote_username must be specified.")) } if c.Password == "" { errs = append(errs, errors.New("remote_password must be specified.")) } if c.HostIp == "" { errs = append(errs, errors.New("remote_host must be specified.")) } if c.HostPortMin > c.HostPortMax { errs = append(errs, errors.New("the host min port must be less than the max")) } if c.HTTPPortMin > c.HTTPPortMax { errs = append(errs, errors.New("the HTTP min port must be less than the max")) } c.BootWait, err = time.ParseDuration(c.RawBootWait) if err != nil { errs = append(errs, fmt.Errorf("Failed to parse boot_wait: %s", err)) } for i, command := range c.BootCommand { if err := t.Validate(command); err != nil { errs = append(errs, fmt.Errorf("Error processing boot_command[%d]: %s", i, err)) } } if c.SSHKeyPath != "" { if _, err := os.Stat(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } else if _, err := commonssh.FileSigner(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } } /* if c.SSHHostPortMin > c.SSHHostPortMax { errs = append(errs, errors.New("ssh_host_port_min must be less than ssh_host_port_max")) } */ if c.SSHUser == "" { errs = append(errs, errors.New("An ssh_username must be specified.")) } c.SSHWaitTimeout, err = time.ParseDuration(c.RawSSHWaitTimeout) if err != nil { errs = append(errs, fmt.Errorf("Failed to parse ssh_wait_timeout: %s", err)) } switch c.Format { case "xva", "vdi_raw", "vdi_vhd", "none": default: errs = append(errs, errors.New("format must be one of 'xva', 'vdi_raw', 'vdi_vhd', 'none'")) } switch c.KeepVM { case "always", "never", "on_success": default: errs = append(errs, errors.New("keep_vm must be one of 'always', 'never', 'on_success'")) } switch c.IPGetter { case "auto", "tools", "http": default: errs = append(errs, errors.New("ip_getter must be one of 'auto', 'tools', 'http'")) } return errs }