github.com/mitchellh/packer@v1.3.2/builder/vmware/common/driver_fusion5.go (about)

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