func (s *stepConfigureVNC) Run(state multistep.StateBag) multistep.StepAction { config := state.Get("config").(*config) driver := state.Get("driver").(vmwcommon.Driver) ui := state.Get("ui").(packer.Ui) vmxPath := state.Get("vmx_path").(string) f, err := os.Open(vmxPath) if err != nil { err := fmt.Errorf("Error reading VMX data: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } vmxBytes, err := ioutil.ReadAll(f) if err != nil { err := fmt.Errorf("Error reading VMX data: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } var vncFinder VNCAddressFinder if finder, ok := driver.(VNCAddressFinder); ok { vncFinder = finder } else { vncFinder = s } log.Printf("Looking for available port between %d and %d", config.VNCPortMin, config.VNCPortMax) vncIp, vncPort := vncFinder.VNCAddress(config.VNCPortMin, config.VNCPortMax) if vncPort == 0 { err := fmt.Errorf("Unable to find available VNC port between %d and %d", config.VNCPortMin, config.VNCPortMax) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } log.Printf("Found available VNC port: %d", vncPort) vmxData := vmwcommon.ParseVMX(string(vmxBytes)) vmxData["remotedisplay.vnc.enabled"] = "TRUE" vmxData["remotedisplay.vnc.port"] = fmt.Sprintf("%d", vncPort) if err := vmwcommon.WriteVMX(vmxPath, vmxData); err != nil { err := fmt.Errorf("Error writing VMX data: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } state.Put("vnc_port", vncPort) state.Put("vnc_ip", vncIp) return multistep.ActionContinue }
func (s *stepCreateVMX) Run(state multistep.StateBag) multistep.StepAction { config := state.Get("config").(*Config) isoPath := state.Get("iso_path").(string) ui := state.Get("ui").(packer.Ui) ui.Say("Building and writing VMX file") vmxTemplate := DefaultVMXTemplate if config.VMXTemplatePath != "" { f, err := os.Open(config.VMXTemplatePath) if err != nil { err := fmt.Errorf("Error reading VMX template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } defer f.Close() rawBytes, err := ioutil.ReadAll(f) if err != nil { err := fmt.Errorf("Error reading VMX template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } vmxTemplate = string(rawBytes) } ctx := config.ctx if len(config.AdditionalDiskSize) > 0 { for i := range config.AdditionalDiskSize { ctx.Data = &additionalDiskTemplateData{ DiskNumber: i + 1, DiskName: config.DiskName, } diskTemplate := DefaultAdditionalDiskTemplate if config.VMXDiskTemplatePath != "" { f, err := os.Open(config.VMXDiskTemplatePath) if err != nil { err := fmt.Errorf("Error reading VMX disk template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } defer f.Close() rawBytes, err := ioutil.ReadAll(f) if err != nil { err := fmt.Errorf("Error reading VMX disk template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } diskTemplate = string(rawBytes) } diskContents, err := interpolate.Render(diskTemplate, &ctx) if err != nil { err := fmt.Errorf("Error preparing VMX template for additional disk: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } vmxTemplate += diskContents } } ctx.Data = &vmxTemplateData{ Name: config.VMName, GuestOS: config.GuestOSType, DiskName: config.DiskName, Version: config.Version, ISOPath: isoPath, } vmxContents, err := interpolate.Render(vmxTemplate, &ctx) if err != nil { err := fmt.Errorf("Error procesing VMX template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } vmxDir := config.OutputDir if config.RemoteType != "" { // For remote builds, we just put the VMX in a temporary // directory since it just gets uploaded anyways. vmxDir, err = ioutil.TempDir("", "packer-vmx") if err != nil { err := fmt.Errorf("Error preparing VMX template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } // Set the tempDir so we clean it up s.tempDir = vmxDir } vmxPath := filepath.Join(vmxDir, config.VMName+".vmx") if err := vmwcommon.WriteVMX(vmxPath, vmwcommon.ParseVMX(vmxContents)); err != nil { err := fmt.Errorf("Error creating VMX file: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } state.Put("vmx_path", vmxPath) return multistep.ActionContinue }
func (s *stepCreateVMX) Run(state multistep.StateBag) multistep.StepAction { config := state.Get("config").(*config) isoPath := state.Get("iso_path").(string) ui := state.Get("ui").(packer.Ui) ui.Say("Building and writing VMX file") tplData := &vmxTemplateData{ Name: config.VMName, GuestOS: config.GuestOSType, DiskName: config.DiskName, ISOPath: isoPath, } vmxTemplate := DefaultVMXTemplate if config.VMXTemplatePath != "" { f, err := os.Open(config.VMXTemplatePath) if err != nil { err := fmt.Errorf("Error reading VMX template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } defer f.Close() rawBytes, err := ioutil.ReadAll(f) if err != nil { err := fmt.Errorf("Error reading VMX template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } vmxTemplate = string(rawBytes) } vmxContents, err := config.tpl.Process(vmxTemplate, tplData) if err != nil { err := fmt.Errorf("Error procesing VMX template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } vmxDir := config.OutputDir if config.RemoteType != "" { // For remote builds, we just put the VMX in a temporary // directory since it just gets uploaded anyways. vmxDir, err = ioutil.TempDir("", "packer-vmx") if err != nil { err := fmt.Errorf("Error preparing VMX template: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } // Set the tempDir so we clean it up s.tempDir = vmxDir } vmxPath := filepath.Join(vmxDir, config.VMName+".vmx") if err := vmwcommon.WriteVMX(vmxPath, vmwcommon.ParseVMX(vmxContents)); err != nil { err := fmt.Errorf("Error creating VMX file: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } state.Put("vmx_path", vmxPath) return multistep.ActionContinue }