// 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("debug", b.config.PackerDebug) state.Put("driver", driver) state.Put("cache", cache) 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.FloppyConfig.FloppyFiles, Directories: b.config.FloppyConfig.FloppyDirectories, }, &common.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, &vboxcommon.StepDownloadGuestAdditions{ GuestAdditionsMode: b.config.GuestAdditionsMode, GuestAdditionsURL: b.config.GuestAdditionsURL, GuestAdditionsSHA256: b.config.GuestAdditionsSHA256, Ctx: b.config.ctx, }, &common.StepDownload{ Checksum: b.config.Checksum, ChecksumType: b.config.ChecksumType, Description: "OVF/OVA", Extension: "ova", ResultKey: "vm_path", TargetPath: b.config.TargetPath, Url: []string{b.config.SourcePath}, }, &StepImport{ Name: b.config.VMName, ImportFlags: b.config.ImportFlags, }, &vboxcommon.StepAttachGuestAdditions{ GuestAdditionsMode: b.config.GuestAdditionsMode, }, &vboxcommon.StepConfigureVRDP{ VRDPBindAddress: b.config.VRDPBindAddress, VRDPPortMin: b.config.VRDPPortMin, VRDPPortMax: b.config.VRDPPortMax, }, 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(b.config.SSHConfig.Comm.SSHHost), 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, Delay: b.config.PostShutdownDelay, }, 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, }, } // Run the steps. b.runner = common.NewRunnerWithPauseFn(steps, b.config.PackerConfig, ui, state) 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) { 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("debug", b.config.PackerDebug) 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", Extension: "iso", ResultKey: "iso_path", TargetPath: b.config.TargetPath, Url: b.config.ISOUrls, }, &vmwcommon.StepOutputDir{ Force: b.config.PackerForce, }, &common.StepCreateFloppy{ Files: b.config.FloppyConfig.FloppyFiles, Directories: b.config.FloppyConfig.FloppyDirectories, }, &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{}, &common.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, &vmwcommon.StepConfigureVNC{ VNCBindAddress: b.config.VNCBindAddress, VNCPortMin: b.config.VNCPortMin, VNCPortMax: b.config.VNCPortMax, VNCDisablePassword: b.config.VNCDisablePassword, }, &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.StepCompactDisk{ Skip: b.config.SkipCompaction, }, &vmwcommon.StepConfigureVMX{ CustomData: b.config.VMXDataPost, SkipFloppy: true, }, &vmwcommon.StepCleanVMX{}, &StepUploadVMX{ RemoteType: b.config.RemoteType, }, &StepExport{ Format: b.config.Format, }, } // Run! b.runner = common.NewRunnerWithPauseFn(steps, b.config.PackerConfig, ui, state) 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 != "" && b.config.Format != "" { 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 }
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{} if !b.config.ISOSkipCache { steps = append(steps, &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, }, ) } else { steps = append(steps, &stepSetISO{ ResultKey: "iso_path", Url: b.config.ISOUrls, }, ) } steps = append(steps, new(stepPrepareOutputDir), &common.StepCreateFloppy{ Files: b.config.FloppyConfig.FloppyFiles, Directories: b.config.FloppyConfig.FloppyDirectories, }, new(stepCreateDisk), new(stepCopyDisk), new(stepResizeDisk), &common.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, ) if b.config.Comm.Type != "none" { steps = append(steps, new(stepForwardSSH), ) } steps = append(steps, new(stepConfigureVNC), steprun, &stepBootWait{}, &stepTypeBootCommand{}, ) if b.config.Comm.Type != "none" { steps = append(steps, &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, SSHPort: commPort, WinRMPort: commPort, }, ) } steps = append(steps, new(common.StepProvision), ) steps = append(steps, new(stepShutdown), ) steps = append(steps, new(stepConvertDisk), ) // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("debug", b.config.PackerDebug) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Run b.runner = common.NewRunnerWithPauseFn(steps, b.config.PackerConfig, ui, state) 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 }
// 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("debug", b.config.PackerDebug) 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{}, &common.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, &vmwcommon.StepConfigureVNC{ VNCBindAddress: b.config.VNCBindAddress, VNCPortMin: b.config.VNCPortMin, VNCPortMax: b.config.VNCPortMax, VNCDisablePassword: b.config.VNCDisablePassword, }, &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.StepCompactDisk{ Skip: b.config.SkipCompaction, }, &vmwcommon.StepConfigureVMX{ CustomData: b.config.VMXDataPost, SkipFloppy: true, }, &vmwcommon.StepCleanVMX{}, } // Run the steps. b.runner = common.NewRunnerWithPauseFn(steps, b.config.PackerConfig, ui, state) 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) }
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{ ¶llelscommon.StepPrepareParallelsTools{ ParallelsToolsFlavor: b.config.ParallelsToolsFlavor, ParallelsToolsMode: b.config.ParallelsToolsMode, }, &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, }, ¶llelscommon.StepOutputDir{ Force: b.config.PackerForce, Path: b.config.OutputDir, }, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &common.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, new(stepCreateVM), new(stepCreateDisk), new(stepSetBootOrder), new(stepAttachISO), ¶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, }, ¶llelscommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, HostInterfaces: b.config.HostInterfaces, VMName: b.config.VMName, Ctx: b.config.ctx, }, &communicator.StepConnect{ Config: &b.config.SSHConfig.Comm, Host: parallelscommon.CommHost, SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig), }, ¶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, }, ¶llelscommon.StepPrlctl{ Commands: b.config.PrlctlPost, Ctx: b.config.ctx, }, ¶llelscommon.StepCompactDisk{ Skip: b.config.SkipCompaction, }, } // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("debug", b.config.PackerDebug) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Run b.runner = common.NewRunnerWithPauseFn(steps, b.config.PackerConfig, ui, state) 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 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("debug", b.config.PackerDebug) 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, }, ¶llelscommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, HostInterfaces: []string{}, VMName: b.config.VMName, Ctx: b.config.ctx, }, &communicator.StepConnect{ Config: &b.config.SSHConfig.Comm, Host: parallelscommon.CommHost, SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig), }, ¶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, }, ¶llelscommon.StepPrlctl{ Commands: b.config.PrlctlPost, Ctx: b.config.ctx, }, } // Run the steps. b.runner = common.NewRunnerWithPauseFn(steps, b.config.PackerConfig, ui, state) 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) }