github.com/rothwerx/packer@v0.9.0/builder/vmware/common/driver_fusion5.go (about)

     1  package common
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"strings"
    11  
    12  	"github.com/mitchellh/multistep"
    13  )
    14  
    15  // Fusion5Driver is a driver that can run VMware Fusion 5.
    16  type Fusion5Driver struct {
    17  	// This is the path to the "VMware Fusion.app"
    18  	AppPath string
    19  
    20  	// SSHConfig are the SSH settings for the Fusion VM
    21  	SSHConfig *SSHConfig
    22  }
    23  
    24  func (d *Fusion5Driver) Clone(dst, src string) error {
    25  	return errors.New("Cloning is not supported with Fusion 5. Please use Fusion 6+.")
    26  }
    27  
    28  func (d *Fusion5Driver) CompactDisk(diskPath string) error {
    29  	defragCmd := exec.Command(d.vdiskManagerPath(), "-d", diskPath)
    30  	if _, _, err := runAndLog(defragCmd); err != nil {
    31  		return err
    32  	}
    33  
    34  	shrinkCmd := exec.Command(d.vdiskManagerPath(), "-k", diskPath)
    35  	if _, _, err := runAndLog(shrinkCmd); err != nil {
    36  		return err
    37  	}
    38  
    39  	return nil
    40  }
    41  
    42  func (d *Fusion5Driver) CreateDisk(output string, size string, type_id string) error {
    43  	cmd := exec.Command(d.vdiskManagerPath(), "-c", "-s", size, "-a", "lsilogic", "-t", type_id, output)
    44  	if _, _, err := runAndLog(cmd); err != nil {
    45  		return err
    46  	}
    47  
    48  	return nil
    49  }
    50  
    51  func (d *Fusion5Driver) IsRunning(vmxPath string) (bool, error) {
    52  	vmxPath, err := filepath.Abs(vmxPath)
    53  	if err != nil {
    54  		return false, err
    55  	}
    56  
    57  	cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "list")
    58  	stdout, _, err := runAndLog(cmd)
    59  	if err != nil {
    60  		return false, err
    61  	}
    62  
    63  	for _, line := range strings.Split(stdout, "\n") {
    64  		if line == vmxPath {
    65  			return true, nil
    66  		}
    67  	}
    68  
    69  	return false, nil
    70  }
    71  
    72  func (d *Fusion5Driver) CommHost(state multistep.StateBag) (string, error) {
    73  	return CommHost(d.SSHConfig)(state)
    74  }
    75  
    76  func (d *Fusion5Driver) Start(vmxPath string, headless bool) error {
    77  	guiArgument := "gui"
    78  	if headless == true {
    79  		guiArgument = "nogui"
    80  	}
    81  
    82  	cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "start", vmxPath, guiArgument)
    83  	if _, _, err := runAndLog(cmd); err != nil {
    84  		return err
    85  	}
    86  
    87  	return nil
    88  }
    89  
    90  func (d *Fusion5Driver) Stop(vmxPath string) error {
    91  	cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "stop", vmxPath, "hard")
    92  	if _, _, err := runAndLog(cmd); err != nil {
    93  		// Check if the VM is running. If its not, it was already stopped
    94  		running, rerr := d.IsRunning(vmxPath)
    95  		if rerr == nil && !running {
    96  			return nil
    97  		}
    98  
    99  		return err
   100  	}
   101  
   102  	return nil
   103  }
   104  
   105  func (d *Fusion5Driver) SuppressMessages(vmxPath string) error {
   106  	dir := filepath.Dir(vmxPath)
   107  	base := filepath.Base(vmxPath)
   108  	base = strings.Replace(base, ".vmx", "", -1)
   109  
   110  	plistPath := filepath.Join(dir, base+".plist")
   111  	return ioutil.WriteFile(plistPath, []byte(fusionSuppressPlist), 0644)
   112  }
   113  
   114  func (d *Fusion5Driver) Verify() error {
   115  	if _, err := os.Stat(d.AppPath); err != nil {
   116  		if os.IsNotExist(err) {
   117  			return fmt.Errorf("Fusion application not found at path: %s", d.AppPath)
   118  		}
   119  
   120  		return err
   121  	}
   122  
   123  	if _, err := os.Stat(d.vmrunPath()); err != nil {
   124  		if os.IsNotExist(err) {
   125  			return fmt.Errorf(
   126  				"Critical application 'vmrun' not found at path: %s", d.vmrunPath())
   127  		}
   128  
   129  		return err
   130  	}
   131  
   132  	if _, err := os.Stat(d.vdiskManagerPath()); err != nil {
   133  		if os.IsNotExist(err) {
   134  			return fmt.Errorf(
   135  				"Critical application vdisk manager not found at path: %s",
   136  				d.vdiskManagerPath())
   137  		}
   138  
   139  		return err
   140  	}
   141  
   142  	return nil
   143  }
   144  
   145  func (d *Fusion5Driver) vdiskManagerPath() string {
   146  	return filepath.Join(d.AppPath, "Contents", "Library", "vmware-vdiskmanager")
   147  }
   148  
   149  func (d *Fusion5Driver) vmrunPath() string {
   150  	return filepath.Join(d.AppPath, "Contents", "Library", "vmrun")
   151  }
   152  
   153  func (d *Fusion5Driver) ToolsIsoPath(k string) string {
   154  	return filepath.Join(d.AppPath, "Contents", "Library", "isoimages", k+".iso")
   155  }
   156  
   157  func (d *Fusion5Driver) ToolsInstall() error {
   158  	return nil
   159  }
   160  
   161  func (d *Fusion5Driver) DhcpLeasesPath(device string) string {
   162  	return "/var/db/vmware/vmnet-dhcpd-" + device + ".leases"
   163  }
   164  
   165  const fusionSuppressPlist = `<?xml version="1.0" encoding="UTF-8"?>
   166  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
   167  <plist version="1.0">
   168  <dict>
   169  	<key>disallowUpgrade</key>
   170  	<true/>
   171  </dict>
   172  </plist>`