github.com/jbronn/packer@v0.1.6-0.20140120165540-8a1364dbd817/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) SSHAddress(state multistep.StateBag) (string, error) {
    73  	return SSHAddressFunc(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  		return err
    94  	}
    95  
    96  	return nil
    97  }
    98  
    99  func (d *Fusion5Driver) SuppressMessages(vmxPath string) error {
   100  	dir := filepath.Dir(vmxPath)
   101  	base := filepath.Base(vmxPath)
   102  	base = strings.Replace(base, ".vmx", "", -1)
   103  
   104  	plistPath := filepath.Join(dir, base+".plist")
   105  	return ioutil.WriteFile(plistPath, []byte(fusionSuppressPlist), 0644)
   106  }
   107  
   108  func (d *Fusion5Driver) Verify() error {
   109  	if _, err := os.Stat(d.AppPath); err != nil {
   110  		if os.IsNotExist(err) {
   111  			return fmt.Errorf("Fusion application not found at path: %s", d.AppPath)
   112  		}
   113  
   114  		return err
   115  	}
   116  
   117  	if _, err := os.Stat(d.vmrunPath()); err != nil {
   118  		if os.IsNotExist(err) {
   119  			return fmt.Errorf(
   120  				"Critical application 'vmrun' not found at path: %s", d.vmrunPath())
   121  		}
   122  
   123  		return err
   124  	}
   125  
   126  	if _, err := os.Stat(d.vdiskManagerPath()); err != nil {
   127  		if os.IsNotExist(err) {
   128  			return fmt.Errorf(
   129  				"Critical application vdisk manager not found at path: %s",
   130  				d.vdiskManagerPath())
   131  		}
   132  
   133  		return err
   134  	}
   135  
   136  	return nil
   137  }
   138  
   139  func (d *Fusion5Driver) vdiskManagerPath() string {
   140  	return filepath.Join(d.AppPath, "Contents", "Library", "vmware-vdiskmanager")
   141  }
   142  
   143  func (d *Fusion5Driver) vmrunPath() string {
   144  	return filepath.Join(d.AppPath, "Contents", "Library", "vmrun")
   145  }
   146  
   147  func (d *Fusion5Driver) ToolsIsoPath(k string) string {
   148  	return filepath.Join(d.AppPath, "Contents", "Library", "isoimages", k+".iso")
   149  }
   150  
   151  func (d *Fusion5Driver) DhcpLeasesPath(device string) string {
   152  	return "/var/db/vmware/vmnet-dhcpd-" + device + ".leases"
   153  }
   154  
   155  const fusionSuppressPlist = `<?xml version="1.0" encoding="UTF-8"?>
   156  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
   157  <plist version="1.0">
   158  <dict>
   159  	<key>disallowUpgrade</key>
   160  	<true/>
   161  </dict>
   162  </plist>`