From c6d1c8e9d55985275ab9187ba7f8f42e55402085 Mon Sep 17 00:00:00 2001
From: Justin Bronn <justin@counsyl.com>
Date: Thu, 22 Aug 2013 11:40:56 -0700
Subject: [PATCH] Make it possible to customize the VMware virtual disk type
 id.

---
 builder/vmware/builder.go             | 6 ++++++
 builder/vmware/driver.go              | 2 +-
 builder/vmware/driver_fusion5.go      | 4 ++--
 builder/vmware/driver_player5.go      | 4 ++--
 builder/vmware/driver_workstation9.go | 4 ++--
 builder/vmware/step_create_disk.go    | 2 +-
 6 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/builder/vmware/builder.go b/builder/vmware/builder.go
index 9db092c0..fa0707e9 100644
--- a/builder/vmware/builder.go
+++ b/builder/vmware/builder.go
@@ -27,6 +27,7 @@ type config struct {
 
 	DiskName          string            `mapstructure:"vmdk_name"`
 	DiskSize          uint              `mapstructure:"disk_size"`
+	DiskTypeId        string            `mapstructure:"disk_type_id"`
 	FloppyFiles       []string          `mapstructure:"floppy_files"`
 	GuestOSType       string            `mapstructure:"guest_os_type"`
 	ISOChecksum       string            `mapstructure:"iso_checksum"`
@@ -84,6 +85,11 @@ func (b *Builder) Prepare(raws ...interface{}) error {
 		b.config.DiskSize = 40000
 	}
 
+	if b.config.DiskTypeId == "" {
+		// Default is growable virtual disk split in 2GB files.
+		b.config.DiskTypeId = "1"
+	}
+
 	if b.config.FloppyFiles == nil {
 		b.config.FloppyFiles = make([]string, 0)
 	}
diff --git a/builder/vmware/driver.go b/builder/vmware/driver.go
index eb1f9ae5..0cec538c 100644
--- a/builder/vmware/driver.go
+++ b/builder/vmware/driver.go
@@ -15,7 +15,7 @@ type Driver interface {
 	CompactDisk(string) error
 
 	// CreateDisk creates a virtual disk with the given size.
-	CreateDisk(string, string) error
+	CreateDisk(string, string, string) error
 
 	// Checks if the VMX file at the given path is running.
 	IsRunning(string) (bool, error)
diff --git a/builder/vmware/driver_fusion5.go b/builder/vmware/driver_fusion5.go
index 7e6d63e6..d86770a9 100644
--- a/builder/vmware/driver_fusion5.go
+++ b/builder/vmware/driver_fusion5.go
@@ -28,8 +28,8 @@ func (d *Fusion5Driver) CompactDisk(diskPath string) error {
 	return nil
 }
 
-func (d *Fusion5Driver) CreateDisk(output string, size string) error {
-	cmd := exec.Command(d.vdiskManagerPath(), "-c", "-s", size, "-a", "lsilogic", "-t", "1", output)
+func (d *Fusion5Driver) CreateDisk(output string, size string, type_id string) error {
+	cmd := exec.Command(d.vdiskManagerPath(), "-c", "-s", size, "-a", "lsilogic", "-t", type_id, output)
 	if _, _, err := runAndLog(cmd); err != nil {
 		return err
 	}
diff --git a/builder/vmware/driver_player5.go b/builder/vmware/driver_player5.go
index 6dbf110a..e5b72bfc 100644
--- a/builder/vmware/driver_player5.go
+++ b/builder/vmware/driver_player5.go
@@ -51,12 +51,12 @@ func (d *Player5LinuxDriver) qemuCompactDisk(diskPath string) error {
 	return nil
 }
 
-func (d *Player5LinuxDriver) CreateDisk(output string, size string) error {
+func (d *Player5LinuxDriver) CreateDisk(output string, size string, type_id string) error {
 	var cmd *exec.Cmd
 	if d.QemuImgPath != "" {
 		cmd = exec.Command(d.QemuImgPath, "create", "-f", "vmdk", "-o", "compat6", output, size)
 	} else {
-		cmd = exec.Command(d.VdiskManagerPath, "-c", "-s", size, "-a", "lsilogic", "-t", "1", output)
+		cmd = exec.Command(d.VdiskManagerPath, "-c", "-s", size, "-a", "lsilogic", "-t", type_id, output)
 	}
 	if _, _, err := runAndLog(cmd); err != nil {
 		return err
diff --git a/builder/vmware/driver_workstation9.go b/builder/vmware/driver_workstation9.go
index ef236cbc..78b0e71d 100644
--- a/builder/vmware/driver_workstation9.go
+++ b/builder/vmware/driver_workstation9.go
@@ -31,8 +31,8 @@ func (d *Workstation9Driver) CompactDisk(diskPath string) error {
 	return nil
 }
 
-func (d *Workstation9Driver) CreateDisk(output string, size string) error {
-	cmd := exec.Command(d.VdiskManagerPath, "-c", "-s", size, "-a", "lsilogic", "-t", "1", output)
+func (d *Workstation9Driver) CreateDisk(output string, size string, type_id string) error {
+	cmd := exec.Command(d.VdiskManagerPath, "-c", "-s", size, "-a", "lsilogic", "-t", type_id, output)
 	if _, _, err := runAndLog(cmd); err != nil {
 		return err
 	}
diff --git a/builder/vmware/step_create_disk.go b/builder/vmware/step_create_disk.go
index 34e9233c..00bb0e2e 100644
--- a/builder/vmware/step_create_disk.go
+++ b/builder/vmware/step_create_disk.go
@@ -25,7 +25,7 @@ func (stepCreateDisk) Run(state map[string]interface{}) multistep.StepAction {
 
 	ui.Say("Creating virtual machine disk")
 	full_disk_path := filepath.Join(config.OutputDir, config.DiskName+".vmdk")
-	if err := driver.CreateDisk(full_disk_path, fmt.Sprintf("%dM", config.DiskSize)); err != nil {
+	if err := driver.CreateDisk(full_disk_path, fmt.Sprintf("%dM", config.DiskSize), config.DiskTypeId); err != nil {
 		err := fmt.Errorf("Error creating disk: %s", err)
 		state["error"] = err
 		ui.Error(err.Error())
-- 
2.30.9