func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver := &DockerDriver{Tpl: b.config.tpl, Ui: ui} if err := driver.Verify(); err != nil { return nil, err } steps := []multistep.Step{ &StepTempDir{}, &StepPull{}, &StepRun{}, &StepProvision{}, } if b.config.Commit { steps = append(steps, new(StepCommit)) } else { steps = append(steps, new(StepExport)) } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) // Setup the driver that will talk to Docker state.Put("driver", driver) // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } var artifact packer.Artifact // No errors, must've worked if b.config.Commit { artifact = &ImportArtifact{ IdValue: state.Get("image_id").(string), BuilderIdValue: BuilderIdImport, Driver: driver, } } else { artifact = &ExportArtifact{path: b.config.ExportPath} } return artifact, nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { // Only accepts input from the vagrant post-processor if artifact.BuilderId() != "mitchellh.post-processor.vagrant" { return nil, false, fmt.Errorf( "Unknown artifact type, requires box from vagrant post-processor: %s", artifact.BuilderId()) } // We assume that there is only one .box file to upload if !strings.HasSuffix(artifact.Files()[0], ".box") { return nil, false, fmt.Errorf( "Unknown files in artifact from vagrant post-processor: %s", artifact.Files()) } // create the HTTP client p.client = VagrantCloudClient{}.New(p.config.VagrantCloudUrl, p.config.AccessToken) // The name of the provider for vagrant cloud, and vagrant providerName := providerFromBuilderName(artifact.Id()) // Set up the state state := new(multistep.BasicStateBag) state.Put("config", p.config) state.Put("client", p.client) state.Put("artifact", artifact) state.Put("artifactFilePath", artifact.Files()[0]) state.Put("ui", ui) state.Put("providerName", providerName) // Build the steps steps := []multistep.Step{ new(stepVerifyBox), new(stepCreateVersion), new(stepCreateProvider), new(stepPrepareUpload), new(stepUpload), new(stepVerifyUpload), new(stepReleaseVersion), } // Run the steps if p.config.PackerDebug { p.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { p.runner = &multistep.BasicRunner{Steps: steps} } p.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, false, rawErr.(error) } return NewArtifact(providerName, p.config.Tag), true, nil }
// Run executes a googlecompute Packer build and returns a packer.Artifact // representing a GCE machine image. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriverGCE( ui, b.config.ProjectId, b.config.clientSecrets, b.config.privateKeyBytes) if err != nil { return nil, err } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ new(StepCreateSSHKey), new(StepCreateInstance), new(StepInstanceInfo), &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, SSHWaitTimeout: 5 * time.Minute, }, new(common.StepProvision), new(StepUpdateGsutil), new(StepCreateImage), new(StepUploadImage), new(StepRegisterImage), } // Run the steps. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("image_name"); !ok { log.Println("Failed to find image_name in state. Bug?") return nil, nil } artifact := &Artifact{ imageName: state.Get("image_name").(string), driver: driver, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Initialize the DO API client client := DigitalOceanClient{}.New(b.config.ClientID, b.config.APIKey) // Set up the state state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("client", client) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ new(stepCreateSSHKey), new(stepCreateDroplet), new(stepDropletInfo), &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, SSHWaitTimeout: 5 * time.Minute, }, new(common.StepProvision), new(stepShutdown), new(stepPowerOff), new(stepSnapshot), } // Run the steps if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("snapshot_name"); !ok { log.Println("Failed to find snapshot_name in state. Bug?") return nil, nil } artifact := &Artifact{ snapshotName: state.Get("snapshot_name").(string), snapshotId: state.Get("snapshot_image_id").(uint), client: client, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { config := b.config driver, err := NewDriverTriton(ui, config) if err != nil { return nil, err } state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) steps := []multistep.Step{ &StepCreateSourceMachine{}, &communicator.StepConnect{ Config: &config.Comm, Host: commHost, SSHConfig: sshConfig, }, &common.StepProvision{}, &StepStopMachine{}, &StepCreateImageFromMachine{}, &StepDeleteMachine{}, } if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there is no image, just return if _, ok := state.GetOk("image"); !ok { return nil, nil } artifact := &Artifact{ ImageID: state.Get("image").(string), BuilderIDValue: BuilderId, Driver: driver, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) steps := []multistep.Step{ &StepCreateSSHKey{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("oneandone_%s", b.config.SnapshotName), }, new(stepCreateServer), &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, &common.StepProvision{}, new(stepTakeSnapshot), } if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if temp, ok := state.GetOk("snapshot_name"); ok { b.config.SnapshotName = temp.(string) } artifact := &Artifact{ snapshotName: b.config.SnapshotName, } if id, ok := state.GetOk("snapshot_id"); ok { artifact.snapshotId = id.(string) } else { return nil, errors.New("Image creation has failed.") } return artifact, nil }
func (b *Builder) createRunner(steps *[]multistep.Step, ui packer.Ui) multistep.Runner { if b.config.PackerDebug { return &multistep.DebugRunner{ Steps: *steps, PauseFn: packerCommon.MultistepDebugFn(ui), } } return &multistep.BasicRunner{ Steps: *steps, } }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { steps := []multistep.Step{ &StepCreateSSHKey{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("pb_%s", b.config.SnapshotName), }, new(stepCreateServer), &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, &common.StepProvision{}, new(stepTakeSnapshot), } state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) config := state.Get("config").(*Config) if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } artifact := &Artifact{ snapshotData: config.SnapshotName, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { steps := []multistep.Step{ &communicator.StepConnect{ Config: &b.config.CommConfig, Host: CommHost(b.config.CommConfig.Host()), SSHConfig: SSHConfig( b.config.CommConfig.SSHUsername, b.config.CommConfig.SSHPassword, b.config.CommConfig.SSHPrivateKey), }, &common.StepProvision{}, } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // No errors, must've worked artifact := &NullArtifact{} return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { computeClient, err := b.config.computeV2Client() if err != nil { return nil, fmt.Errorf("Error initializing compute client: %s", err) } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &StepLoadExtensions{}, &StepLoadFlavor{ Flavor: b.config.Flavor, }, &StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("os_%s.pem", b.config.PackerBuildName), }, &StepRunSourceServer{ Name: b.config.ImageName, SourceImage: b.config.SourceImage, SecurityGroups: b.config.SecurityGroups, Networks: b.config.Networks, AvailabilityZone: b.config.AvailabilityZone, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, }, &StepWaitForRackConnect{ Wait: b.config.RackconnectWait, }, &StepAllocateIp{ FloatingIpPool: b.config.FloatingIpPool, FloatingIp: b.config.FloatingIp, }, &communicator.StepConnect{ Config: &b.config.RunConfig.Comm, Host: CommHost( computeClient, b.config.SSHInterface), SSHConfig: SSHConfig(b.config.RunConfig.Comm.SSHUsername), }, &common.StepProvision{}, &StepStopServer{}, &stepCreateImage{}, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no images, then just return if _, ok := state.GetOk("image"); !ok { return nil, nil } // Build the artifact and return it artifact := &Artifact{ ImageId: state.Get("image").(string), BuilderIdValue: BuilderId, Client: computeClient, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { if runtime.GOOS != "linux" { return nil, errors.New("The amazon-chroot builder only works on Linux environments.") } config, err := b.config.Config() if err != nil { return nil, err } session := session.New(config) ec2conn := ec2.New(session) wrappedCommand := func(command string) (string, error) { ctx := b.config.ctx ctx.Data = &wrappedCommandTemplate{Command: command} return interpolate.Render(b.config.CommandWrapper, &ctx) } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) state.Put("wrappedCommand", CommandWrapper(wrappedCommand)) // Build the steps steps := []multistep.Step{ &awscommon.StepPreValidate{ DestAmiName: b.config.AMIName, ForceDeregister: b.config.AMIForceDeregister, }, &StepInstanceInfo{}, &awscommon.StepSourceAMIInfo{ SourceAmi: b.config.SourceAmi, EnhancedNetworking: b.config.AMIEnhancedNetworking, }, &StepCheckRootDevice{}, &StepFlock{}, &StepPrepareDevice{}, &StepCreateVolume{ RootVolumeSize: b.config.RootVolumeSize, }, &StepAttachVolume{}, &StepEarlyUnflock{}, &StepMountDevice{ MountOptions: b.config.MountOptions, MountPartition: b.config.MountPartition, }, &StepMountExtra{}, &StepCopyFiles{}, &StepChrootProvision{}, &StepEarlyCleanup{}, &StepSnapshot{}, &awscommon.StepDeregisterAMI{ ForceDeregister: b.config.AMIForceDeregister, AMIName: b.config.AMIName, }, &StepRegisterAMI{ RootVolumeSize: b.config.RootVolumeSize, }, &awscommon.StepAMIRegionCopy{ AccessConfig: &b.config.AccessConfig, Regions: b.config.AMIRegions, Name: b.config.AMIName, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, ProductCodes: b.config.AMIProductCodes, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("amis").(map[string]string), BuilderIdValue: BuilderId, Conn: ec2conn, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the driver that we'll use to communicate with VirtualBox driver, err := vboxcommon.NewDriver() if err != nil { return nil, fmt.Errorf("Failed creating VirtualBox driver: %s", err) } steps := []multistep.Step{ &vboxcommon.StepDownloadGuestAdditions{ GuestAdditionsMode: b.config.GuestAdditionsMode, GuestAdditionsURL: b.config.GuestAdditionsURL, GuestAdditionsSHA256: b.config.GuestAdditionsSHA256, Ctx: b.config.ctx, }, &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", ResultKey: "iso_path", Url: b.config.ISOUrls, Extension: "iso", }, &vboxcommon.StepOutputDir{ Force: b.config.PackerForce, Path: b.config.OutputDir, }, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &vboxcommon.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, new(vboxcommon.StepSuppressMessages), new(stepCreateVM), new(stepCreateDisk), new(stepAttachISO), &vboxcommon.StepAttachGuestAdditions{ GuestAdditionsMode: b.config.GuestAdditionsMode, }, new(vboxcommon.StepAttachFloppy), &vboxcommon.StepForwardSSH{ CommConfig: &b.config.SSHConfig.Comm, HostPortMin: b.config.SSHHostPortMin, HostPortMax: b.config.SSHHostPortMax, SkipNatMapping: b.config.SSHSkipNatMapping, }, &vboxcommon.StepVBoxManage{ Commands: b.config.VBoxManage, Ctx: b.config.ctx, }, &vboxcommon.StepRun{ BootWait: b.config.BootWait, Headless: b.config.Headless, }, &vboxcommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, VMName: b.config.VMName, Ctx: b.config.ctx, }, &communicator.StepConnect{ Config: &b.config.SSHConfig.Comm, Host: vboxcommon.CommHost, SSHConfig: vboxcommon.SSHConfigFunc(b.config.SSHConfig), SSHPort: vboxcommon.SSHPort, }, &vboxcommon.StepUploadVersion{ Path: b.config.VBoxVersionFile, }, &vboxcommon.StepUploadGuestAdditions{ GuestAdditionsMode: b.config.GuestAdditionsMode, GuestAdditionsPath: b.config.GuestAdditionsPath, Ctx: b.config.ctx, }, new(common.StepProvision), &vboxcommon.StepShutdown{ Command: b.config.ShutdownCommand, Timeout: b.config.ShutdownTimeout, }, new(vboxcommon.StepRemoveDevices), &vboxcommon.StepVBoxManage{ Commands: b.config.VBoxManagePost, Ctx: b.config.ctx, }, &vboxcommon.StepExport{ Format: b.config.Format, OutputDir: b.config.OutputDir, ExportOpts: b.config.ExportOpts.ExportOpts, SkipNatMapping: b.config.SSHSkipNatMapping, }, } // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Run if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } return vboxcommon.NewArtifact(b.config.OutputDir) }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriver(&b.config) if err != nil { return nil, fmt.Errorf("Failed creating VMware driver: %s", err) } // Seed the random number generator rand.Seed(time.Now().UTC().UnixNano()) steps := []multistep.Step{ &stepPrepareTools{}, &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", ResultKey: "iso_path", Url: b.config.ISOUrls, }, &stepPrepareOutputDir{}, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &stepRemoteUpload{ Key: "iso_path", Message: "Uploading ISO to remote machine...", }, &stepCreateDisk{}, &stepCreateVMX{}, &stepSuppressMessages{}, &stepHTTPServer{}, &stepConfigureVNC{}, &stepRun{}, &stepTypeBootCommand{}, &common.StepConnectSSH{ SSHAddress: driver.SSHAddress, SSHConfig: sshConfig, SSHWaitTimeout: b.config.sshWaitTimeout, NoPty: b.config.SSHSkipRequestPty, }, &stepUploadTools{}, &common.StepProvision{}, &stepShutdown{}, &stepCleanFiles{}, &stepCleanVMX{}, &stepCompactDisk{}, } // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } // Compile the artifact list files, err := state.Get("dir").(OutputDir).ListFiles() if err != nil { return nil, err } // Set the proper builder ID builderId := BuilderId if b.config.RemoteType != "" { builderId = BuilderIdESX } return &Artifact{ builderId: builderId, dir: b.config.OutputDir, f: files, }, nil }
// Run executes a Packer build and returns a packer.Artifact representing // a VirtualBox appliance. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the driver that we'll use to communicate with VirtualBox driver, err := vboxcommon.NewDriver() if err != nil { return nil, fmt.Errorf("Failed creating VirtualBox driver: %s", err) } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ &vboxcommon.StepOutputDir{ Force: b.config.PackerForce, Path: b.config.OutputDir, }, new(vboxcommon.StepSuppressMessages), &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &StepImport{ Name: b.config.VMName, SourcePath: b.config.SourcePath, }, /* new(stepAttachGuestAdditions), */ new(vboxcommon.StepAttachFloppy), &vboxcommon.StepForwardSSH{ GuestPort: b.config.SSHPort, HostPortMin: b.config.SSHHostPortMin, HostPortMax: b.config.SSHHostPortMax, }, &vboxcommon.StepVBoxManage{ Commands: b.config.VBoxManage, Tpl: b.config.tpl, }, &vboxcommon.StepRun{ BootWait: b.config.BootWait, Headless: b.config.Headless, }, &common.StepConnectSSH{ SSHAddress: vboxcommon.SSHAddress, SSHConfig: vboxcommon.SSHConfigFunc(b.config.SSHConfig), SSHWaitTimeout: b.config.SSHWaitTimeout, }, &vboxcommon.StepUploadVersion{ Path: b.config.VBoxVersionFile, }, /* new(stepUploadGuestAdditions), */ new(common.StepProvision), &vboxcommon.StepShutdown{ Command: b.config.ShutdownCommand, Timeout: b.config.ShutdownTimeout, }, new(vboxcommon.StepRemoveDevices), &vboxcommon.StepExport{ Format: b.config.Format, OutputDir: b.config.OutputDir, }, } // Run the steps. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } return vboxcommon.NewArtifact(b.config.OutputDir) }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the driver that we'll use to communicate with Parallels driver, err := parallelscommon.NewDriver() if err != nil { return nil, fmt.Errorf("Failed creating Parallels driver: %s", err) } steps := []multistep.Step{ &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", ResultKey: "iso_path", Url: b.config.ISOUrls, }, ¶llelscommon.StepOutputDir{ Force: b.config.PackerForce, Path: b.config.OutputDir, }, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, new(stepHTTPServer), new(stepCreateVM), new(stepCreateDisk), new(stepAttachISO), ¶llelscommon.StepAttachParallelsTools{ ParallelsToolsHostPath: b.config.ParallelsToolsHostPath, ParallelsToolsMode: b.config.ParallelsToolsMode, }, new(parallelscommon.StepAttachFloppy), ¶llelscommon.StepPrlctl{ Commands: b.config.Prlctl, Tpl: b.config.tpl, }, ¶llelscommon.StepRun{ BootWait: b.config.BootWait, Headless: b.config.Headless, // TODO: migth work on Enterprise Ed. }, ¶llelscommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, HostInterfaces: b.config.HostInterfaces, VMName: b.config.VMName, Tpl: b.config.tpl, }, &common.StepConnectSSH{ SSHAddress: parallelscommon.SSHAddress, SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig), SSHWaitTimeout: b.config.SSHWaitTimeout, }, ¶llelscommon.StepUploadVersion{ Path: b.config.PrlctlVersionFile, }, ¶llelscommon.StepUploadParallelsTools{ ParallelsToolsGuestPath: b.config.ParallelsToolsGuestPath, ParallelsToolsHostPath: b.config.ParallelsToolsHostPath, ParallelsToolsMode: b.config.ParallelsToolsMode, Tpl: b.config.tpl, }, new(common.StepProvision), ¶llelscommon.StepShutdown{ Command: b.config.ShutdownCommand, Timeout: b.config.ShutdownTimeout, }, new(parallelscommon.StepRemoveDevices), } // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Run if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } return parallelscommon.NewArtifact(b.config.OutputDir) }
// Run implements the packer.Builder interface. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { b.ui = ui // Create a CloudStack API client. client := cloudstack.NewAsyncClient( b.config.APIURL, b.config.APIKey, b.config.SecretKey, !b.config.SSLNoVerify, ) // Set the time to wait before timing out client.AsyncTimeout(int64(b.config.AsyncTimeout.Seconds())) // Some CloudStack service providers only allow HTTP GET calls. client.HTTPGETOnly = b.config.HTTPGetOnly // Set up the state. state := new(multistep.BasicStateBag) state.Put("client", client) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ &stepPrepareConfig{}, &stepCreateInstance{}, &stepSetupNetworking{}, &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, &common.StepProvision{}, &stepShutdownInstance{}, &stepCreateTemplate{}, } // Configure the runner. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } // Run the steps. b.runner.Run(state) // If there are no templates, then just return template, ok := state.Get("template").(*cloudstack.CreateTemplateResponse) if !ok || template == nil { return nil, nil } // Build the artifact and return it artifact := &Artifact{ client: client, config: b.config, template: template, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { auth, err := b.config.AccessConfig.Auth() if err != nil { return nil, err } api := &gophercloud.ApiCriteria{ Name: "cloudServersOpenStack", Region: b.config.AccessConfig.Region(), VersionId: "2", UrlChoice: gophercloud.PublicURL, } csp, err := gophercloud.ServersApi(auth, *api) if err != nil { log.Printf("Region: %s", b.config.AccessConfig.Region()) return nil, err } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("csp", csp) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &StepKeyPair{}, &StepRunSourceServer{ Name: b.config.ImageName, Flavor: b.config.Flavor, SourceImage: b.config.SourceImage, }, &common.StepConnectSSH{ SSHAddress: SSHAddress(csp, b.config.SSHPort), SSHConfig: SSHConfig(b.config.SSHUsername), SSHWaitTimeout: b.config.SSHTimeout(), }, &common.StepProvision{}, &stepCreateImage{}, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no images, then just return if _, ok := state.GetOk("image"); !ok { return nil, nil } // Build the artifact and return it artifact := &Artifact{ ImageId: state.Get("image").(string), BuilderIdValue: BuilderId, Conn: csp, } return artifact, nil }
// Run executes a googlecompute Packer build and returns a packer.Artifact // representing a GCE machine image. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriverGCE( ui, b.config.ProjectId, &b.config.account) if err != nil { return nil, err } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ new(StepCheckExistingImage), &StepCreateSSHKey{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("gce_%s.pem", b.config.PackerBuildName), }, &StepCreateInstance{ Debug: b.config.PackerDebug, }, &StepInstanceInfo{ Debug: b.config.PackerDebug, }, &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, new(common.StepProvision), new(StepWaitInstanceStartup), new(StepTeardownInstance), new(StepCreateImage), } // Run the steps. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("image"); !ok { log.Println("Failed to find image in state. Bug?") return nil, nil } artifact := &Artifact{ image: state.Get("image").(Image), driver: driver, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriver(&b.config) if err != nil { return nil, fmt.Errorf("Failed creating VMware driver: %s", err) } // Determine the output dir implementation var dir OutputDir switch d := driver.(type) { case OutputDir: dir = d default: dir = new(vmwcommon.LocalOutputDir) } if b.config.RemoteType != "" && b.config.Format != "" { b.config.OutputDir = b.config.VMName } dir.SetOutputDir(b.config.OutputDir) // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("dir", dir) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) steps := []multistep.Step{ &vmwcommon.StepPrepareTools{ RemoteType: b.config.RemoteType, ToolsUploadFlavor: b.config.ToolsUploadFlavor, }, &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", ResultKey: "iso_path", Url: b.config.ISOUrls, Extension: "iso", TargetPath: b.config.TargetPath, }, &vmwcommon.StepOutputDir{ Force: b.config.PackerForce, }, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &stepRemoteUpload{ Key: "floppy_path", Message: "Uploading Floppy to remote machine...", }, &stepRemoteUpload{ Key: "iso_path", Message: "Uploading ISO to remote machine...", }, &stepCreateDisk{}, &stepCreateVMX{}, &vmwcommon.StepConfigureVMX{ CustomData: b.config.VMXData, }, &vmwcommon.StepSuppressMessages{}, &vmwcommon.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, &vmwcommon.StepConfigureVNC{ VNCPortMin: b.config.VNCPortMin, VNCPortMax: b.config.VNCPortMax, }, &StepRegister{ Format: b.config.Format, }, &vmwcommon.StepRun{ BootWait: b.config.BootWait, DurationBeforeStop: 5 * time.Second, Headless: b.config.Headless, }, &vmwcommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, VMName: b.config.VMName, Ctx: b.config.ctx, }, &communicator.StepConnect{ Config: &b.config.SSHConfig.Comm, Host: driver.CommHost, SSHConfig: vmwcommon.SSHConfigFunc(&b.config.SSHConfig), }, &vmwcommon.StepUploadTools{ RemoteType: b.config.RemoteType, ToolsUploadFlavor: b.config.ToolsUploadFlavor, ToolsUploadPath: b.config.ToolsUploadPath, Ctx: b.config.ctx, }, &common.StepProvision{}, &vmwcommon.StepShutdown{ Command: b.config.ShutdownCommand, Timeout: b.config.ShutdownTimeout, }, &vmwcommon.StepCleanFiles{}, &vmwcommon.StepConfigureVMX{ CustomData: b.config.VMXDataPost, SkipFloppy: true, }, &vmwcommon.StepCleanVMX{}, &StepUploadVMX{ RemoteType: b.config.RemoteType, }, &vmwcommon.StepCompactDisk{ Skip: b.config.SkipCompaction, }, &StepExport{ Format: b.config.Format, }, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } // Compile the artifact list var files []string if b.config.RemoteType != "" { dir = new(vmwcommon.LocalOutputDir) dir.SetOutputDir(b.config.OutputDir) files, err = dir.ListFiles() } else { files, err = state.Get("dir").(OutputDir).ListFiles() } if err != nil { return nil, err } // Set the proper builder ID builderId := vmwcommon.BuilderId if b.config.RemoteType != "" { builderId = BuilderIdESX } return &Artifact{ builderId: builderId, dir: dir, f: files, }, nil }
// Run executes a Packer build and returns a packer.Artifact representing // a Hyperv appliance. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the driver that we'll use to communicate with Hyperv driver, err := hypervcommon.NewHypervPS4Driver() if err != nil { return nil, fmt.Errorf("Failed creating Hyper-V driver: %s", err) } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // TODO: remove the next line // state.Put("vmName", "FullActiavated") steps := []multistep.Step{ // new(hypervcommon.StepAcceptEula), new(hypervcommon.StepCreateTempDir), &hypervcommon.StepOutputDir{ Force: b.config.PackerForce, Path: b.config.OutputDir, }, &hypervcommon.StepCreateSwitch{ SwitchName: b.config.SwitchName, }, new(StepCreateVM), new(hypervcommon.StepEnableIntegrationService), new(StepMountDvdDrive), new(StepMountFloppydrive), // new(hypervcommon.StepConfigureVlan), new(hypervcommon.StepStartVm), &hypervcommon.StepSleep{Minutes: b.config.SleepTimeMinutes, ActionName: "Installing"}, new(hypervcommon.StepConfigureIp), new(hypervcommon.StepSetRemoting), new(common.StepProvision), new(StepInstallProductKey), new(StepExportVm), // new(hypervcommon.StepConfigureIp), // new(hypervcommon.StepSetRemoting), // new(hypervcommon.StepCheckRemoting), // new(msbldcommon.StepSysprep), } // Run the steps. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } return hypervcommon.NewArtifact(b.config.OutputDir) }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { auth, err := b.config.AccessConfig.Auth() if err != nil { return nil, err } //fetches the api requisites from gophercloud for the appropriate //openstack variant api, err := gophercloud.PopulateApi(b.config.RunConfig.OpenstackProvider) if err != nil { return nil, err } api.Region = b.config.AccessConfig.Region() csp, err := gophercloud.ServersApi(auth, api) if err != nil { log.Printf("Region: %s", b.config.AccessConfig.Region()) return nil, err } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("csp", csp) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("os_%s.pem", b.config.PackerBuildName), }, &StepRunSourceServer{ Name: b.config.ImageName, Flavor: b.config.Flavor, SourceImage: b.config.SourceImage, SecurityGroups: b.config.SecurityGroups, Networks: b.config.Networks, }, &StepWaitForRackConnect{ Wait: b.config.RackconnectWait, }, &StepAllocateIp{ FloatingIpPool: b.config.FloatingIpPool, FloatingIp: b.config.FloatingIp, }, &common.StepConnectSSH{ SSHAddress: SSHAddress(csp, b.config.SSHInterface, b.config.SSHPort), SSHConfig: SSHConfig(b.config.SSHUsername), SSHWaitTimeout: b.config.SSHTimeout(), }, &common.StepProvision{}, &stepCreateImage{}, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no images, then just return if _, ok := state.GetOk("image"); !ok { return nil, nil } // Build the artifact and return it artifact := &Artifact{ ImageId: state.Get("image").(string), BuilderIdValue: BuilderId, Conn: csp, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the driver that we'll use to communicate with VirtualBox driver, err := b.newDriver() if err != nil { return nil, fmt.Errorf("Failed creating VirtualBox driver: %s", err) } steps := []multistep.Step{ new(stepDownloadGuestAdditions), &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", ResultKey: "iso_path", Url: b.config.ISOUrls, }, new(stepPrepareOutputDir), &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, new(stepHTTPServer), new(stepSuppressMessages), new(stepCreateVM), new(stepCreateDisk), new(stepAttachISO), new(stepAttachGuestAdditions), new(stepAttachFloppy), new(stepForwardSSH), new(stepVBoxManage), new(stepRun), new(stepTypeBootCommand), &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, SSHWaitTimeout: b.config.sshWaitTimeout, }, new(stepUploadVersion), new(stepUploadGuestAdditions), new(common.StepProvision), new(stepShutdown), new(stepExport), } // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Run if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } // Compile the artifact list files := make([]string, 0, 5) visit := func(path string, info os.FileInfo, err error) error { if !info.IsDir() { files = append(files, path) } return err } if err := filepath.Walk(b.config.OutputDir, visit); err != nil { return nil, err } artifact := &Artifact{ dir: b.config.OutputDir, f: files, } return artifact, nil }
// Run executes a Packer build and returns a packer.Artifact representing // a Hyperv appliance. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the driver that we'll use to communicate with Hyperv driver, err := hypervcommon.NewHypervPS4Driver() if err != nil { return nil, fmt.Errorf("Failed creating Hyper-V driver: %s", err) } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) steps := []multistep.Step{ &hypervcommon.StepCreateTempDir{}, &hypervcommon.StepOutputDir{ Force: b.config.PackerForce, Path: b.config.OutputDir, }, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &hypervcommon.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, &hypervcommon.StepCreateSwitch{ SwitchName: b.config.SwitchName, }, &hypervcommon.StepCreateVM{ VMName: b.config.VMName, SwitchName: b.config.SwitchName, RamSizeMB: b.config.RamSizeMB, DiskSize: b.config.DiskSize, Generation: b.config.Generation, Cpu: b.config.Cpu, EnabeSecureBoot: b.config.EnableSecureBoot, }, &hypervcommon.StepConfigureVlan{ VlanId: b.config.VlanId, }, &hypervcommon.StepEnableIntegrationService{}, &hypervcommon.StepMountDvdDrive{ RawSingleISOUrl: b.config.RawSingleISOUrl, }, &hypervcommon.StepMountFloppydrive{}, &hypervcommon.StepMountSecondaryDvdImages{ Files: b.config.SecondaryDvdImages, Generation: b.config.Generation, }, &hypervcommon.StepRun{ BootWait: b.config.BootWait, Headless: b.config.Headless, }, &hypervcommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, SwitchName: b.config.SwitchName, Ctx: b.config.ctx, }, // configure the communicator ssh, winrm &communicator.StepConnect{ Config: &b.config.SSHConfig.Comm, Host: hypervcommon.CommHost, SSHConfig: hypervcommon.SSHConfigFunc(&b.config.SSHConfig), }, // provision requires communicator to be setup &common.StepProvision{}, &hypervcommon.StepShutdown{ Command: b.config.ShutdownCommand, Timeout: b.config.ShutdownTimeout, }, // wait for the vm to be powered off &hypervcommon.StepWaitForPowerOff{}, // remove the integration services dvd drive // after we power down &hypervcommon.StepUnmountSecondaryDvdImages{}, &hypervcommon.StepUnmountFloppyDrive{ Generation: b.config.Generation, }, &hypervcommon.StepUnmountDvdDrive{}, &hypervcommon.StepExportVm{ OutputDir: b.config.OutputDir, SkipCompaction: b.config.SkipCompaction, }, // the clean up actions for each step will be executed reverse order } // Run the steps. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } return hypervcommon.NewArtifact(b.config.OutputDir) }
// Run executes a Packer build and returns a packer.Artifact representing // a Parallels appliance. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the driver that we'll use to communicate with Parallels driver, err := parallelscommon.NewDriver() if err != nil { return nil, fmt.Errorf("Failed creating Paralles driver: %s", err) } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) state.Put("http_port", uint(0)) // Build the steps. steps := []multistep.Step{ ¶llelscommon.StepPrepareParallelsTools{ ParallelsToolsMode: b.config.ParallelsToolsMode, ParallelsToolsFlavor: b.config.ParallelsToolsFlavor, }, ¶llelscommon.StepOutputDir{ Force: b.config.PackerForce, Path: b.config.OutputDir, }, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &StepImport{ Name: b.config.VMName, SourcePath: b.config.SourcePath, }, ¶llelscommon.StepAttachParallelsTools{ ParallelsToolsMode: b.config.ParallelsToolsMode, }, new(parallelscommon.StepAttachFloppy), ¶llelscommon.StepPrlctl{ Commands: b.config.Prlctl, Ctx: b.config.ctx, }, ¶llelscommon.StepRun{ BootWait: b.config.BootWait, Headless: b.config.Headless, }, ¶llelscommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, HostInterfaces: []string{}, VMName: b.config.VMName, Ctx: b.config.ctx, }, &common.StepConnectSSH{ SSHAddress: parallelscommon.SSHAddress, SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig), SSHWaitTimeout: b.config.SSHWaitTimeout, }, ¶llelscommon.StepUploadVersion{ Path: b.config.PrlctlVersionFile, }, ¶llelscommon.StepUploadParallelsTools{ ParallelsToolsFlavor: b.config.ParallelsToolsFlavor, ParallelsToolsGuestPath: b.config.ParallelsToolsGuestPath, ParallelsToolsMode: b.config.ParallelsToolsMode, Ctx: b.config.ctx, }, new(common.StepProvision), ¶llelscommon.StepShutdown{ Command: b.config.ShutdownCommand, Timeout: b.config.ShutdownTimeout, }, } // Run the steps. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } return parallelscommon.NewArtifact(b.config.OutputDir) }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the driver that we'll use to communicate with Qemu driver, err := b.newDriver(b.config.QemuBinary) if err != nil { return nil, fmt.Errorf("Failed creating Qemu driver: %s", err) } steprun := &stepRun{} if !b.config.DiskImage { steprun.BootDrive = "once=d" steprun.Message = "Starting VM, booting from CD-ROM" } else { steprun.BootDrive = "c" steprun.Message = "Starting VM, booting disk image" } steps := []multistep.Step{ &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", Extension: "iso", ResultKey: "iso_path", TargetPath: b.config.TargetPath, Url: b.config.ISOUrls, }, new(stepPrepareOutputDir), &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, new(stepCreateDisk), new(stepCopyDisk), new(stepResizeDisk), &common.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, new(stepForwardSSH), new(stepConfigureVNC), steprun, &stepBootWait{}, &stepTypeBootCommand{}, &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, SSHPort: commPort, }, new(common.StepProvision), new(stepShutdown), new(stepConvertDisk), } // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Run if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } // Compile the artifact list files := make([]string, 0, 5) visit := func(path string, info os.FileInfo, err error) error { if !info.IsDir() { files = append(files, path) } return err } if err := filepath.Walk(b.config.OutputDir, visit); err != nil { return nil, err } artifact := &Artifact{ dir: b.config.OutputDir, f: files, state: make(map[string]interface{}), } artifact.state["diskName"] = state.Get("disk_filename").(string) artifact.state["diskType"] = b.config.Format artifact.state["diskSize"] = uint64(b.config.DiskSize) artifact.state["domainType"] = b.config.Accelerator return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { config, err := b.config.Config() if err != nil { return nil, err } session := session.New(config) ec2conn := ec2.New(session) // If the subnet is specified but not the AZ, try to determine the AZ automatically if b.config.SubnetId != "" && b.config.AvailabilityZone == "" { log.Printf("[INFO] Finding AZ for the given subnet '%s'", b.config.SubnetId) resp, err := ec2conn.DescribeSubnets(&ec2.DescribeSubnetsInput{SubnetIds: []*string{&b.config.SubnetId}}) if err != nil { return nil, err } b.config.AvailabilityZone = *resp.Subnets[0].AvailabilityZone log.Printf("[INFO] AZ found: '%s'", b.config.AvailabilityZone) } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &awscommon.StepPreValidate{ DestAmiName: b.config.AMIName, ForceDeregister: b.config.AMIForceDeregister, }, &awscommon.StepSourceAMIInfo{ SourceAmi: b.config.SourceAmi, EnhancedNetworking: b.config.AMIEnhancedNetworking, }, &awscommon.StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("ec2_%s.pem", b.config.PackerBuildName), KeyPairName: b.config.SSHKeyPairName, PrivateKeyFile: b.config.RunConfig.Comm.SSHPrivateKey, TemporaryKeyPairName: b.config.TemporaryKeyPairName, }, &awscommon.StepSecurityGroup{ CommConfig: &b.config.RunConfig.Comm, SecurityGroupIds: b.config.SecurityGroupIds, VpcId: b.config.VpcId, }, &awscommon.StepRunSourceInstance{ Debug: b.config.PackerDebug, SpotPrice: b.config.SpotPrice, SpotPriceProduct: b.config.SpotPriceAutoProduct, InstanceType: b.config.InstanceType, IamInstanceProfile: b.config.IamInstanceProfile, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, SourceAMI: b.config.SourceAmi, SubnetId: b.config.SubnetId, AssociatePublicIpAddress: b.config.AssociatePublicIpAddress, EbsOptimized: b.config.EbsOptimized, AvailabilityZone: b.config.AvailabilityZone, BlockDevices: b.config.BlockDevices, Tags: b.config.RunTags, }, &awscommon.StepGetPassword{ Debug: b.config.PackerDebug, Comm: &b.config.RunConfig.Comm, Timeout: b.config.WindowsPasswordTimeout, }, &communicator.StepConnect{ Config: &b.config.RunConfig.Comm, Host: awscommon.SSHHost( ec2conn, b.config.SSHPrivateIp), SSHConfig: awscommon.SSHConfig( b.config.RunConfig.Comm.SSHUsername), }, &common.StepProvision{}, &StepUploadX509Cert{}, &StepBundleVolume{ Debug: b.config.PackerDebug, }, &StepUploadBundle{ Debug: b.config.PackerDebug, }, &awscommon.StepDeregisterAMI{ ForceDeregister: b.config.AMIForceDeregister, AMIName: b.config.AMIName, }, &StepRegisterAMI{}, &awscommon.StepAMIRegionCopy{ AccessConfig: &b.config.AccessConfig, Regions: b.config.AMIRegions, Name: b.config.AMIName, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, ProductCodes: b.config.AMIProductCodes, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("amis").(map[string]string), BuilderIdValue: BuilderId, Conn: ec2conn, } return artifact, nil }
// Run executes a Packer build and returns a packer.Artifact representing // a VirtualBox appliance. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := vmwcommon.NewDriver(&b.config.DriverConfig, &b.config.SSHConfig) if err != nil { return nil, fmt.Errorf("Failed creating VMware driver: %s", err) } // Setup the directory dir := new(vmwcommon.LocalOutputDir) dir.SetOutputDir(b.config.OutputDir) // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("dir", dir) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ &vmwcommon.StepPrepareTools{ RemoteType: b.config.RemoteType, ToolsUploadFlavor: b.config.ToolsUploadFlavor, }, &vmwcommon.StepOutputDir{ Force: b.config.PackerForce, }, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &StepCloneVMX{ OutputDir: b.config.OutputDir, Path: b.config.SourcePath, VMName: b.config.VMName, }, &vmwcommon.StepConfigureVMX{ CustomData: b.config.VMXData, }, &vmwcommon.StepSuppressMessages{}, &vmwcommon.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, &vmwcommon.StepConfigureVNC{ VNCPortMin: b.config.VNCPortMin, VNCPortMax: b.config.VNCPortMax, }, &vmwcommon.StepRun{ BootWait: b.config.BootWait, DurationBeforeStop: 5 * time.Second, Headless: b.config.Headless, }, &vmwcommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, VMName: b.config.VMName, Ctx: b.config.ctx, }, &common.StepConnectSSH{ SSHAddress: driver.SSHAddress, SSHConfig: vmwcommon.SSHConfigFunc(&b.config.SSHConfig), SSHWaitTimeout: b.config.SSHWaitTimeout, NoPty: b.config.SSHSkipRequestPty, }, &vmwcommon.StepUploadTools{ RemoteType: b.config.RemoteType, ToolsUploadFlavor: b.config.ToolsUploadFlavor, ToolsUploadPath: b.config.ToolsUploadPath, Ctx: b.config.ctx, }, &common.StepProvision{}, &vmwcommon.StepShutdown{ Command: b.config.ShutdownCommand, Timeout: b.config.ShutdownTimeout, }, &vmwcommon.StepCleanFiles{}, &vmwcommon.StepConfigureVMX{ CustomData: b.config.VMXDataPost, SkipFloppy: true, }, &vmwcommon.StepCleanVMX{}, &vmwcommon.StepCompactDisk{ Skip: b.config.SkipCompaction, }, } // Run the steps. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } return vmwcommon.NewLocalArtifact(b.config.OutputDir) }
// Run executes a Packer build and returns a packer.Artifact representing // a Azure VM image. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { ui.Say("Preparing builder...") ui.Message("Creating Azure Service Management client...") subscriptionID, err := findSubscriptionID(b.config.PublishSettingsPath, b.config.SubscriptionName) if err != nil { return nil, fmt.Errorf("Error creating new Azure client: %v", err) } b.client, err = management.ClientFromPublishSettingsFile(b.config.PublishSettingsPath, subscriptionID) if err != nil { return nil, fmt.Errorf("Error creating new Azure client: %v", err) } // add logger if appropriate b.client = GetLoggedClient(b.client) // Set up the state. state := new(multistep.BasicStateBag) state.Put(constants.Config, b.config) state.Put(constants.RequestManager, b.client) state.Put("hook", hook) state.Put(constants.Ui, ui) // complete flags state.Put(constants.SrvExists, 0) state.Put(constants.CertInstalled, 0) state.Put(constants.CertUploaded, 0) state.Put(constants.VmExists, 0) state.Put(constants.DiskExists, 0) state.Put(constants.VmRunning, 0) state.Put(constants.ImageCreated, 0) var steps []multistep.Step if b.config.OSType == constants.Target_Linux { steps = []multistep.Step{ &lin.StepCreateCert{ TmpServiceName: b.config.tmpServiceName, }, new(StepValidate), &StepCreateService{ Location: b.config.Location, TmpServiceName: b.config.tmpServiceName, }, &StepUploadCertificate{ TmpServiceName: b.config.tmpServiceName, }, new(StepCreateVm), &StepPollStatus{ TmpServiceName: b.config.tmpServiceName, TmpVmName: b.config.tmpVmName, OSType: b.config.OSType, }, &communicator.StepConnectSSH{ Config: &b.config.Comm, Host: lin.SSHHost, SSHConfig: lin.SSHConfig(b.config.UserName), }, &common.StepProvision{}, &lin.StepGeneralizeOS{ Command: "sudo /usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync", }, &StepStopVm{ TmpVmName: b.config.tmpVmName, TmpServiceName: b.config.tmpServiceName, }, &StepCreateImage{ TmpServiceName: b.config.tmpServiceName, TmpVmName: b.config.tmpVmName, UserImageName: b.config.userImageName, UserImageLabel: b.config.UserImageLabel, RecommendedVMSize: b.config.InstanceSize, }, } } else if b.config.OSType == constants.Target_Windows { steps = []multistep.Step{ new(StepValidate), &StepCreateService{ Location: b.config.Location, TmpServiceName: b.config.tmpServiceName, }, new(StepCreateVm), &StepPollStatus{ TmpServiceName: b.config.tmpServiceName, TmpVmName: b.config.tmpVmName, OSType: b.config.OSType, }, &win.StepSetProvisionInfrastructure{ VmName: b.config.tmpVmName, ServiceName: b.config.tmpServiceName, StorageAccountName: b.config.StorageAccount, TempContainerName: b.config.tmpContainerName, ProvisionTimeoutInMinutes: b.config.ProvisionTimeoutInMinutes, }, &common.StepProvision{}, &StepStopVm{ TmpVmName: b.config.tmpVmName, TmpServiceName: b.config.tmpServiceName, }, &StepCreateImage{ TmpServiceName: b.config.tmpServiceName, TmpVmName: b.config.tmpVmName, UserImageName: b.config.userImageName, UserImageLabel: b.config.UserImageLabel, RecommendedVMSize: b.config.InstanceSize, }, } } else { return nil, fmt.Errorf("Unkonwn OS type: %s", b.config.OSType) } // Run the steps. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } vmImageList, err := vmimage.NewClient(b.client).ListVirtualMachineImages( vmimage.ListParameters{ Location: b.config.Location, }) if err != nil { log.Printf("VM image client returned error: %s", err) return nil, fmt.Errorf("Can't create artifact") } if userImage, found := FindVmImage(vmImageList.VMImages, b.config.userImageName, b.config.UserImageLabel); found { return &artifact{ imageLabel: userImage.Label, imageName: userImage.Name, mediaLocation: userImage.OSDiskConfiguration.MediaLink, publishSettingsPath: b.config.PublishSettingsPath, subscriptionID: subscriptionID, }, nil } else { log.Printf("could not find image %s", b.config.userImageName) return nil, fmt.Errorf("Can't create artifact") } }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { region, err := b.config.Region() if err != nil { return nil, err } auth, err := b.config.AccessConfig.Auth() if err != nil { return nil, err } ec2conn := ec2.New(auth, region) // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &awscommon.StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("ec2_%s.pem", b.config.PackerBuildName), KeyPairName: b.config.TemporaryKeyPairName, PrivateKeyFile: b.config.SSHPrivateKeyFile, }, &awscommon.StepSecurityGroup{ SecurityGroupIds: b.config.SecurityGroupIds, SSHPort: b.config.SSHPort, VpcId: b.config.VpcId, }, &awscommon.StepRunSourceInstance{ Debug: b.config.PackerDebug, ExpectedRootDevice: "instance-store", InstanceType: b.config.InstanceType, IamInstanceProfile: b.config.IamInstanceProfile, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, SourceAMI: b.config.SourceAmi, SubnetId: b.config.SubnetId, AssociatePublicIpAddress: b.config.AssociatePublicIpAddress, AvailabilityZone: b.config.AvailabilityZone, BlockDevices: b.config.BlockDevices, Tags: b.config.RunTags, }, &common.StepConnectSSH{ SSHAddress: awscommon.SSHAddress(ec2conn, b.config.SSHPort), SSHConfig: awscommon.SSHConfig(b.config.SSHUsername), SSHWaitTimeout: b.config.SSHTimeout(), }, &common.StepProvision{}, &StepUploadX509Cert{}, &StepBundleVolume{}, &StepUploadBundle{}, &StepRegisterAMI{}, &awscommon.StepAMIRegionCopy{ Regions: b.config.AMIRegions, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, ProductCodes: b.config.AMIProductCodes, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("amis").(map[string]string), BuilderIdValue: BuilderId, Conn: ec2conn, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { config, err := b.config.Config() if err != nil { return nil, err } ec2conn := ec2.New(config) // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &awscommon.StepPreValidate{ DestAmiName: b.config.AMIName, ForceDeregister: b.config.AMIForceDeregister, }, &awscommon.StepSourceAMIInfo{ SourceAmi: b.config.SourceAmi, EnhancedNetworking: b.config.AMIEnhancedNetworking, }, &awscommon.StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("ec2_%s.pem", b.config.PackerBuildName), KeyPairName: b.config.SSHKeyPairName, TemporaryKeyPairName: b.config.TemporaryKeyPairName, PrivateKeyFile: b.config.RunConfig.Comm.SSHPrivateKey, }, &awscommon.StepSecurityGroup{ SecurityGroupIds: b.config.SecurityGroupIds, CommConfig: &b.config.RunConfig.Comm, VpcId: b.config.VpcId, }, &stepCleanupVolumes{ BlockDevices: b.config.BlockDevices, }, &awscommon.StepRunSourceInstance{ Debug: b.config.PackerDebug, ExpectedRootDevice: "ebs", SpotPrice: b.config.SpotPrice, SpotPriceProduct: b.config.SpotPriceAutoProduct, InstanceType: b.config.InstanceType, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, SourceAMI: b.config.SourceAmi, IamInstanceProfile: b.config.IamInstanceProfile, SubnetId: b.config.SubnetId, AssociatePublicIpAddress: b.config.AssociatePublicIpAddress, AvailabilityZone: b.config.AvailabilityZone, BlockDevices: b.config.BlockDevices, Tags: b.config.RunTags, }, &awscommon.StepGetPassword{ Comm: &b.config.RunConfig.Comm, Timeout: b.config.WindowsPasswordTimeout, }, &communicator.StepConnect{ Config: &b.config.RunConfig.Comm, Host: awscommon.SSHHost( ec2conn, b.config.SSHPrivateIp), SSHConfig: awscommon.SSHConfig( b.config.RunConfig.Comm.SSHUsername), }, &common.StepProvision{}, &stepStopInstance{SpotPrice: b.config.SpotPrice}, // TODO(mitchellh): verify works with spots &stepModifyInstance{}, &awscommon.StepDeregisterAMI{ ForceDeregister: b.config.AMIForceDeregister, AMIName: b.config.AMIName, }, &stepCreateAMI{}, &awscommon.StepAMIRegionCopy{ AccessConfig: &b.config.AccessConfig, Regions: b.config.AMIRegions, Name: b.config.AMIName, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("amis").(map[string]string), BuilderIdValue: BuilderId, Conn: ec2conn, } return artifact, nil }