From 05a34d2fb11355f6a91d1333dc7b9d5f1e819b95 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 4 Jun 2013 16:52:59 -0700 Subject: [PATCH] builder/vmware: Create disk and create VMX file --- builder/vmware/builder.go | 11 +++ builder/vmware/step_create_disk.go | 2 +- builder/vmware/step_create_vmx.go | 119 +++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 builder/vmware/step_create_vmx.go diff --git a/builder/vmware/builder.go b/builder/vmware/builder.go index 9603eee8e..8f3ff4fdf 100644 --- a/builder/vmware/builder.go +++ b/builder/vmware/builder.go @@ -13,10 +13,20 @@ type Builder struct { } type config struct { + DiskName string `mapstructure:"vmdk_name"` + VMName string `mapstructure:"vm_name"` OutputDir string `mapstructure:"output_directory"` } func (b *Builder) Prepare(raw interface{}) (err error) { + if b.config.DiskName == "" { + b.config.DiskName = "disk" + } + + if b.config.VMName == "" { + b.config.VMName = "packer" + } + if b.config.OutputDir == "" { b.config.OutputDir = "vmware" } @@ -28,6 +38,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact { steps := []multistep.Step{ &stepPrepareOutputDir{}, &stepCreateDisk{}, + &stepCreateVMX{}, } // Setup the state bag diff --git a/builder/vmware/step_create_disk.go b/builder/vmware/step_create_disk.go index 4187af6c6..8129f1cf9 100644 --- a/builder/vmware/step_create_disk.go +++ b/builder/vmware/step_create_disk.go @@ -18,7 +18,7 @@ func (stepCreateDisk) Run(state map[string]interface{}) multistep.StepAction { ui := state["ui"].(packer.Ui) vdisk_manager := "/Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager" - output := filepath.Join(config.OutputDir, "disk.vmdk") + output := filepath.Join(config.OutputDir, config.DiskName+".vmdk") ui.Say("Creating virtual machine disk") cmd := exec.Command(vdisk_manager, "-c", "-s", "40000M", "-a", "lsilogic", "-t", "1", output) diff --git a/builder/vmware/step_create_vmx.go b/builder/vmware/step_create_vmx.go new file mode 100644 index 000000000..2383a3dac --- /dev/null +++ b/builder/vmware/step_create_vmx.go @@ -0,0 +1,119 @@ +package vmware + +import ( + "fmt" + "github.com/mitchellh/multistep" + "github.com/mitchellh/packer/packer" + "os" + "path/filepath" + "text/template" +) + +type vmxTemplateData struct { + Name string + GuestOS string + DiskName string +} + +type stepCreateVMX struct{} + +func (stepCreateVMX) Run(state map[string]interface{}) multistep.StepAction { + config := state["config"].(*config) + ui := state["ui"].(packer.Ui) + + vmx_path := filepath.Join(config.OutputDir, config.VMName+".vmx") + f, err := os.Create(vmx_path) + if err != nil { + ui.Error(fmt.Sprintf("Error creating VMX: %s", err)) + return multistep.ActionHalt + } + + tplData := &vmxTemplateData{ + config.VMName, + "ubuntu-64", + config.DiskName, + } + + t := template.Must(template.New("vmx").Parse(DefaultVMXTemplate)) + t.Execute(f, tplData) + + return multistep.ActionContinue +} + +func (stepCreateVMX) Cleanup(map[string]interface{}) { +} + +// This is the default VMX template used if no other template is given. +// This is hardcoded here. If you wish to use a custom template please +// do so by specifying in the builder configuration. +const DefaultVMXTemplate = ` +.encoding = "UTF-8" +bios.bootOrder = "hdd,CDROM" +checkpoint.vmState = "" +cleanShutdown = "TRUE" +config.version = "8" +displayName = "{{ .Name }}" +ehci.pciSlotNumber = "34" +ehci.present = "TRUE" +ethernet0.addressType = "generated" +ethernet0.bsdName = "en0" +ethernet0.connectionType = "nat" +ethernet0.displayName = "Ethernet" +ethernet0.linkStatePropagation.enable = "FALSE" +ethernet0.pciSlotNumber = "33" +ethernet0.present = "TRUE" +ethernet0.virtualDev = "e1000" +ethernet0.wakeOnPcktRcv = "FALSE" +extendedConfigFile = "{{ .Name }}.vmxf" +floppy0.present = "FALSE" +guestOS = "{{ .GuestOS }}" +gui.fullScreenAtPowerOn = "FALSE" +gui.viewModeAtPowerOn = "windowed" +hgfs.linkRootShare = "TRUE" +hgfs.mapRootShare = "TRUE" +isolation.tools.hgfs.disable = "FALSE" +memsize = "512" +nvram = "{{ .Name }}.nvram" +pciBridge0.pciSlotNumber = "17" +pciBridge0.present = "TRUE" +pciBridge4.functions = "8" +pciBridge4.pciSlotNumber = "21" +pciBridge4.present = "TRUE" +pciBridge4.virtualDev = "pcieRootPort" +pciBridge5.functions = "8" +pciBridge5.pciSlotNumber = "22" +pciBridge5.present = "TRUE" +pciBridge5.virtualDev = "pcieRootPort" +pciBridge6.functions = "8" +pciBridge6.pciSlotNumber = "23" +pciBridge6.present = "TRUE" +pciBridge6.virtualDev = "pcieRootPort" +pciBridge7.functions = "8" +pciBridge7.pciSlotNumber = "24" +pciBridge7.present = "TRUE" +pciBridge7.virtualDev = "pcieRootPort" +powerType.powerOff = "soft" +powerType.powerOn = "soft" +powerType.reset = "soft" +powerType.suspend = "soft" +proxyApps.publishToHost = "FALSE" +replay.filename = "" +replay.supported = "FALSE" +scsi0.pciSlotNumber = "16" +scsi0.present = "TRUE" +scsi0.virtualDev = "lsilogic" +scsi0:0.fileName = "{{ .DiskName }}.vmdk" +scsi0:0.present = "TRUE" +scsi0:0.redo = "" +sound.startConnected = "FALSE" +tools.syncTime = "TRUE" +tools.upgrade.policy = "upgradeAtPowerCycle" +usb.pciSlotNumber = "32" +usb.present = "FALSE" +virtualHW.productCompatibility = "hosted" +virtualHW.version = "9" +vmci0.id = "1861462627" +vmci0.pciSlotNumber = "35" +vmci0.present = "TRUE" +vmotion.checkpointFBSize = "65536000" +`