packer-cn/builder/vmware/common/driver_workstation10.go

68 lines
1.5 KiB
Go

package common
import (
"bytes"
"fmt"
"log"
"os/exec"
"regexp"
"runtime"
"strings"
)
// Workstation10Driver is a driver that can run VMware Workstation 10
// installations. Current only tested for UNIX
type Workstation10Driver struct {
Workstation9Driver
}
func (d *Workstation10Driver) Clone(dst, src string) error {
cmd := exec.Command(d.Workstation9Driver.VmrunPath,
"-T", "ws",
"clone", src, dst,
"full")
if _, _, err := runAndLog(cmd); err != nil {
return err
}
return nil
}
func (d *Workstation10Driver) Verify() error {
if runtime.GOOS != "linux" {
return fmt.Errorf("WS10 driver is only supported on Linux at the moment. Your OS: %s", runtime.GOOS)
}
if err := d.Workstation9Driver.Verify(); err != nil {
return err
}
//TODO(pmyjavec) there is a better way to find this, how?
//the default will suffice for now.
vmxpath := "/usr/lib/vmware/bin/vmware-vmx"
var stderr bytes.Buffer
cmd := exec.Command(vmxpath, "-v")
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil {
return err
}
versionRe := regexp.MustCompile(`(?i)VMware Workstation (\d+\.\d+\.\d+)\s`)
matches := versionRe.FindStringSubmatch(stderr.String())
if matches == nil {
return fmt.Errorf(
"Couldn't find VMware WS version in output: %s", stderr.String())
}
log.Printf("Detected VMware WS version: %s", matches[1])
if !strings.HasPrefix(matches[1], "10.") {
return fmt.Errorf(
"WS 10 not detected. Got version: %s", matches[1])
}
return nil
}