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

     1  package common
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"strings"
    11  
    12  	"github.com/hashicorp/packer/helper/multistep"
    13  )
    14  
    15  // Workstation9Driver is a driver that can run VMware Workstation 9
    16  type Workstation9Driver struct {
    17  	VmwareDriver
    18  
    19  	AppPath          string
    20  	VdiskManagerPath string
    21  	VmrunPath        string
    22  
    23  	// SSHConfig are the SSH settings for the Fusion VM
    24  	SSHConfig *SSHConfig
    25  }
    26  
    27  func (d *Workstation9Driver) Clone(dst, src string, linked bool) error {
    28  	return errors.New("Cloning is not supported with VMware WS version 9. Please use VMware WS version 10, or greater.")
    29  }
    30  
    31  func (d *Workstation9Driver) 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 *Workstation9Driver) 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 *Workstation9Driver) 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", "ws", "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 *Workstation9Driver) CommHost(state multistep.StateBag) (string, error) {
    76  	return CommHost(d.SSHConfig)(state)
    77  }
    78  
    79  func (d *Workstation9Driver) Start(vmxPath string, headless bool) error {
    80  	guiArgument := "gui"
    81  	if headless {
    82  		guiArgument = "nogui"
    83  	}
    84  
    85  	cmd := exec.Command(d.VmrunPath, "-T", "ws", "start", vmxPath, guiArgument)
    86  	if _, _, err := runAndLog(cmd); err != nil {
    87  		return err
    88  	}
    89  
    90  	return nil
    91  }
    92  
    93  func (d *Workstation9Driver) Stop(vmxPath string) error {
    94  	cmd := exec.Command(d.VmrunPath, "-T", "ws", "stop", vmxPath, "hard")
    95  	if _, _, err := runAndLog(cmd); err != nil {
    96  		return err
    97  	}
    98  
    99  	return nil
   100  }
   101  
   102  func (d *Workstation9Driver) SuppressMessages(vmxPath string) error {
   103  	return nil
   104  }
   105  
   106  func (d *Workstation9Driver) Verify() error {
   107  	var err error
   108  	if d.AppPath == "" {
   109  		if d.AppPath, err = workstationFindVMware(); err != nil {
   110  			return err
   111  		}
   112  	}
   113  
   114  	if d.VmrunPath == "" {
   115  		if d.VmrunPath, err = workstationFindVmrun(); err != nil {
   116  			return err
   117  		}
   118  	}
   119  
   120  	if d.VdiskManagerPath == "" {
   121  		if d.VdiskManagerPath, err = workstationFindVdiskManager(); err != nil {
   122  			return err
   123  		}
   124  	}
   125  
   126  	log.Printf("VMware app path: %s", d.AppPath)
   127  	log.Printf("vmrun path: %s", d.VmrunPath)
   128  	log.Printf("vdisk-manager path: %s", d.VdiskManagerPath)
   129  
   130  	if _, err := os.Stat(d.AppPath); err != nil {
   131  		return fmt.Errorf("VMware application not found: %s", d.AppPath)
   132  	}
   133  
   134  	if _, err := os.Stat(d.VmrunPath); err != nil {
   135  		return fmt.Errorf("'vmrun' application not found: %s", d.VmrunPath)
   136  	}
   137  
   138  	if _, err := os.Stat(d.VdiskManagerPath); err != nil {
   139  		return fmt.Errorf("'vmware-vdiskmanager' application not found: %s", d.VdiskManagerPath)
   140  	}
   141  
   142  	// Check to see if it APPEARS to be licensed.
   143  	if err := workstationCheckLicense(); err != nil {
   144  		return err
   145  	}
   146  
   147  	// Assigning the path callbacks to VmwareDriver
   148  	d.VmwareDriver.DhcpLeasesPath = func(device string) string {
   149  		return workstationDhcpLeasesPath(device)
   150  	}
   151  
   152  	d.VmwareDriver.DhcpConfPath = func(device string) string {
   153  		return workstationDhcpConfPath(device)
   154  	}
   155  
   156  	d.VmwareDriver.VmnetnatConfPath = func(device string) string {
   157  		return workstationVmnetnatConfPath(device)
   158  	}
   159  
   160  	d.VmwareDriver.NetworkMapper = func() (NetworkNameMapper, error) {
   161  		pathNetmap := workstationNetmapConfPath()
   162  		if _, err := os.Stat(pathNetmap); err != nil {
   163  			return nil, fmt.Errorf("Could not find netmap conf file: %s", pathNetmap)
   164  		}
   165  		log.Printf("Located networkmapper configuration file using Workstation: %s", pathNetmap)
   166  
   167  		return ReadNetmapConfig(pathNetmap)
   168  	}
   169  	return nil
   170  }
   171  
   172  func (d *Workstation9Driver) ToolsIsoPath(flavor string) string {
   173  	return workstationToolsIsoPath(flavor)
   174  }
   175  
   176  func (d *Workstation9Driver) ToolsInstall() error {
   177  	return nil
   178  }
   179  
   180  func (d *Workstation9Driver) GetVmwareDriver() VmwareDriver {
   181  	return d.VmwareDriver
   182  }