github.com/mitchellh/packer@v1.3.2/builder/vmware/common/driver_player5.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  // Player5Driver is a driver that can run VMware Player 5 on Linux.
    16  type Player5Driver struct {
    17  	VmwareDriver
    18  
    19  	AppPath          string
    20  	VdiskManagerPath string
    21  	QemuImgPath      string
    22  	VmrunPath        string
    23  
    24  	// SSHConfig are the SSH settings for the Fusion VM
    25  	SSHConfig *SSHConfig
    26  }
    27  
    28  func (d *Player5Driver) Clone(dst, src string, linked bool) error {
    29  	return errors.New("Cloning is not supported with VMWare Player version 5. Please use VMWare Player version 6, or greater.")
    30  }
    31  
    32  func (d *Player5Driver) CompactDisk(diskPath string) error {
    33  	if d.QemuImgPath != "" {
    34  		return d.qemuCompactDisk(diskPath)
    35  	}
    36  
    37  	defragCmd := exec.Command(d.VdiskManagerPath, "-d", diskPath)
    38  	if _, _, err := runAndLog(defragCmd); err != nil {
    39  		return err
    40  	}
    41  
    42  	shrinkCmd := exec.Command(d.VdiskManagerPath, "-k", diskPath)
    43  	if _, _, err := runAndLog(shrinkCmd); err != nil {
    44  		return err
    45  	}
    46  
    47  	return nil
    48  }
    49  
    50  func (d *Player5Driver) qemuCompactDisk(diskPath string) error {
    51  	cmd := exec.Command(d.QemuImgPath, "convert", "-f", "vmdk", "-O", "vmdk", "-o", "compat6", diskPath, diskPath+".new")
    52  	if _, _, err := runAndLog(cmd); err != nil {
    53  		return err
    54  	}
    55  
    56  	if err := os.Remove(diskPath); err != nil {
    57  		return err
    58  	}
    59  
    60  	if err := os.Rename(diskPath+".new", diskPath); err != nil {
    61  		return err
    62  	}
    63  
    64  	return nil
    65  }
    66  
    67  func (d *Player5Driver) CreateDisk(output string, size string, adapter_type string, type_id string) error {
    68  	var cmd *exec.Cmd
    69  	if d.QemuImgPath != "" {
    70  		cmd = exec.Command(d.QemuImgPath, "create", "-f", "vmdk", "-o", "compat6", output, size)
    71  	} else {
    72  		cmd = exec.Command(d.VdiskManagerPath, "-c", "-s", size, "-a", adapter_type, "-t", type_id, output)
    73  	}
    74  	if _, _, err := runAndLog(cmd); err != nil {
    75  		return err
    76  	}
    77  
    78  	return nil
    79  }
    80  
    81  func (d *Player5Driver) IsRunning(vmxPath string) (bool, error) {
    82  	vmxPath, err := filepath.Abs(vmxPath)
    83  	if err != nil {
    84  		return false, err
    85  	}
    86  
    87  	cmd := exec.Command(d.VmrunPath, "-T", "player", "list")
    88  	stdout, _, err := runAndLog(cmd)
    89  	if err != nil {
    90  		return false, err
    91  	}
    92  
    93  	for _, line := range strings.Split(stdout, "\n") {
    94  		if line == vmxPath {
    95  			return true, nil
    96  		}
    97  	}
    98  
    99  	return false, nil
   100  }
   101  
   102  func (d *Player5Driver) CommHost(state multistep.StateBag) (string, error) {
   103  	return CommHost(d.SSHConfig)(state)
   104  }
   105  
   106  func (d *Player5Driver) Start(vmxPath string, headless bool) error {
   107  	guiArgument := "gui"
   108  	if headless {
   109  		guiArgument = "nogui"
   110  	}
   111  
   112  	cmd := exec.Command(d.VmrunPath, "-T", "player", "start", vmxPath, guiArgument)
   113  	if _, _, err := runAndLog(cmd); err != nil {
   114  		return err
   115  	}
   116  
   117  	return nil
   118  }
   119  
   120  func (d *Player5Driver) Stop(vmxPath string) error {
   121  	cmd := exec.Command(d.VmrunPath, "-T", "player", "stop", vmxPath, "hard")
   122  	if _, _, err := runAndLog(cmd); err != nil {
   123  		return err
   124  	}
   125  
   126  	return nil
   127  }
   128  
   129  func (d *Player5Driver) SuppressMessages(vmxPath string) error {
   130  	return nil
   131  }
   132  
   133  func (d *Player5Driver) Verify() error {
   134  	var err error
   135  	if d.AppPath == "" {
   136  		if d.AppPath, err = playerFindVMware(); err != nil {
   137  			return err
   138  		}
   139  	}
   140  
   141  	if d.VmrunPath == "" {
   142  		if d.VmrunPath, err = playerFindVmrun(); err != nil {
   143  			return err
   144  		}
   145  	}
   146  
   147  	if d.VdiskManagerPath == "" {
   148  		d.VdiskManagerPath, err = playerFindVdiskManager()
   149  	}
   150  
   151  	if d.VdiskManagerPath == "" && d.QemuImgPath == "" {
   152  		d.QemuImgPath, err = playerFindQemuImg()
   153  	}
   154  
   155  	if err != nil {
   156  		return fmt.Errorf(
   157  			"Neither 'vmware-vdiskmanager', nor 'qemu-img' found in path.\n" +
   158  				"One of these is required to configure disks for VMware Player.")
   159  	}
   160  
   161  	log.Printf("VMware app path: %s", d.AppPath)
   162  	log.Printf("vmrun path: %s", d.VmrunPath)
   163  	log.Printf("vdisk-manager path: %s", d.VdiskManagerPath)
   164  	log.Printf("qemu-img path: %s", d.QemuImgPath)
   165  
   166  	if _, err := os.Stat(d.AppPath); err != nil {
   167  		return fmt.Errorf("VMware application not found: %s", d.AppPath)
   168  	}
   169  
   170  	if _, err := os.Stat(d.VmrunPath); err != nil {
   171  		return fmt.Errorf("'vmrun' application not found: %s", d.VmrunPath)
   172  	}
   173  
   174  	if d.VdiskManagerPath != "" {
   175  		_, err = os.Stat(d.VdiskManagerPath)
   176  	} else {
   177  		_, err = os.Stat(d.QemuImgPath)
   178  	}
   179  
   180  	if err != nil {
   181  		return fmt.Errorf(
   182  			"Neither 'vmware-vdiskmanager', nor 'qemu-img' found in path.\n" +
   183  				"One of these is required to configure disks for VMware Player.")
   184  	}
   185  
   186  	// Assigning the path callbacks to VmwareDriver
   187  	d.VmwareDriver.DhcpLeasesPath = func(device string) string {
   188  		return playerDhcpLeasesPath(device)
   189  	}
   190  
   191  	d.VmwareDriver.DhcpConfPath = func(device string) string {
   192  		return playerVmDhcpConfPath(device)
   193  	}
   194  
   195  	d.VmwareDriver.VmnetnatConfPath = func(device string) string {
   196  		return playerVmnetnatConfPath(device)
   197  	}
   198  
   199  	d.VmwareDriver.NetworkMapper = func() (NetworkNameMapper, error) {
   200  		pathNetmap := playerNetmapConfPath()
   201  		if _, err := os.Stat(pathNetmap); err != nil {
   202  			return nil, fmt.Errorf("Could not find netmap conf file: %s", pathNetmap)
   203  		}
   204  		log.Printf("Located networkmapper configuration file using Player: %s", pathNetmap)
   205  
   206  		return ReadNetmapConfig(pathNetmap)
   207  	}
   208  	return nil
   209  }
   210  
   211  func (d *Player5Driver) ToolsIsoPath(flavor string) string {
   212  	return playerToolsIsoPath(flavor)
   213  }
   214  
   215  func (d *Player5Driver) ToolsInstall() error {
   216  	return nil
   217  }
   218  
   219  func (d *Player5Driver) GetVmwareDriver() VmwareDriver {
   220  	return d.VmwareDriver
   221  }