diff --git a/builder/vmware/common/step_compact_disk.go b/builder/vmware/common/step_compact_disk.go index 777e8aaea..a76cf4d7f 100644 --- a/builder/vmware/common/step_compact_disk.go +++ b/builder/vmware/common/step_compact_disk.go @@ -36,6 +36,18 @@ func (s StepCompactDisk) Run(state multistep.StateBag) multistep.StepAction { state.Put("error", fmt.Errorf("Error compacting disk: %s", err)) return multistep.ActionHalt } + + moreDisks := state.Get("additional_disk_paths").([]string) + if len(moreDisks) > 0 { + for i, path := range moreDisks { + ui.Say(fmt.Sprintf("Compacting additional disk image %d",i+1)) + if err := driver.CompactDisk(path); err != nil { + state.Put("error", fmt.Errorf("Error compacting additional disk %d: %s", i+1, err)) + return multistep.ActionHalt + } + } + + } return multistep.ActionContinue } diff --git a/builder/vmware/iso/builder.go b/builder/vmware/iso/builder.go index c63bfdc8b..065d20603 100644 --- a/builder/vmware/iso/builder.go +++ b/builder/vmware/iso/builder.go @@ -35,6 +35,7 @@ type Config struct { vmwcommon.ToolsConfig `mapstructure:",squash"` vmwcommon.VMXConfig `mapstructure:",squash"` + AdditionalDiskSize []uint `mapstructure:"additionaldisk_size"` DiskName string `mapstructure:"vmdk_name"` DiskSize uint `mapstructure:"disk_size"` DiskTypeId string `mapstructure:"disk_type_id"` diff --git a/builder/vmware/iso/step_create_disk.go b/builder/vmware/iso/step_create_disk.go index b357cad01..b5a1bfd87 100644 --- a/builder/vmware/iso/step_create_disk.go +++ b/builder/vmware/iso/step_create_disk.go @@ -34,6 +34,28 @@ func (stepCreateDisk) Run(state multistep.StateBag) multistep.StepAction { } state.Put("full_disk_path", full_disk_path) + + if len(config.AdditionalDiskSize) > 0 { + // stash the disk paths we create + additional_paths := make([]string,len(config.AdditionalDiskSize)) + + ui.Say("Creating additional hard drives...") + for i, additionalsize := range config.AdditionalDiskSize { + additionalpath := filepath.Join(config.OutputDir, fmt.Sprintf("%s-%d.vmdk",config.DiskName,i+1)) + size := fmt.Sprintf("%dM", uint64(additionalsize)) + + if err := driver.CreateDisk(additionalpath, size, config.DiskTypeId); err != nil { + err := fmt.Errorf("Error creating additional disk: %s", err) + state.Put("error",err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + + additional_paths[i] = additionalpath + } + + state.Put("additional_disk_paths", additional_paths) + } return multistep.ActionContinue } diff --git a/builder/vmware/iso/step_create_vmx.go b/builder/vmware/iso/step_create_vmx.go index 5a1a829b5..dde3859a0 100644 --- a/builder/vmware/iso/step_create_vmx.go +++ b/builder/vmware/iso/step_create_vmx.go @@ -20,6 +20,11 @@ type vmxTemplateData struct { Version string } +type additionalDiskTemplateData struct { + DiskNumber int + DiskName string +} + // This step creates the VMX file for the VM. // // Uses: @@ -70,6 +75,25 @@ func (s *stepCreateVMX) Run(state multistep.StateBag) multistep.StepAction { vmxTemplate = string(rawBytes) } + + if len(config.AdditionalDiskSize) > 0 { + for i, _ := range config.AdditionalDiskSize { + data := &additionalDiskTemplateData{ + DiskNumber: i+1, + DiskName: config.DiskName, + } + + diskTemplate, err := config.tpl.Process(DefaultAdditionalDiskTemplate,data) + 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 += diskTemplate + } + } vmxContents, err := interpolate.Render(vmxTemplate, &ctx) if err != nil { @@ -191,3 +215,9 @@ vmci0.pciSlotNumber = "35" vmci0.present = "TRUE" vmotion.checkpointFBSize = "65536000" ` + +const DefaultAdditionalDiskTemplate = ` +scsi0:{{ .DiskNumber }}.fileName = "{{ .DiskName}}-{{ .DiskNumber }}.vmdk" +scsi0:{{ .DiskNumber }}.present = "TRUE" +scsi0:{{ .DiskNumber }}.redo = "" +`