import cpu and memory settings when importing b2d vm

Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
Evan Hazlett 2015-04-13 13:26:34 -04:00
parent a01322fa77
commit 33eab99e58
5 changed files with 123 additions and 24 deletions

View File

@ -19,7 +19,7 @@ func parseDiskInfo(r io.Reader) (*VirtualDisk, error) {
if line == "" {
continue
}
res := reEqualLine.FindStringSubmatch(line)
res := reEqualQuoteLine.FindStringSubmatch(line)
if res == nil {
continue
}

View File

@ -18,7 +18,8 @@ var (
reVMNameUUID = regexp.MustCompile(`"(.+)" {([0-9a-f-]+)}`)
reVMInfoLine = regexp.MustCompile(`(?:"(.+)"|(.+))=(?:"(.*)"|(.*))`)
reColonLine = regexp.MustCompile(`(.+):\s+(.*)`)
reEqualLine = regexp.MustCompile(`"(.+)"="(.*)"`)
reEqualLine = regexp.MustCompile(`(.+)=(.*)`)
reEqualQuoteLine = regexp.MustCompile(`"(.+)"="(.*)"`)
reMachineNotFound = regexp.MustCompile(`Could not find a registered machine named '(.+)'`)
)

View File

@ -186,11 +186,33 @@ func (d *Driver) Create() error {
// import b2d VM if requested
if d.Boot2DockerImportVM != "" {
log.Debugf("Importing disk image...")
if err := d.importB2DVM(d.Boot2DockerImportVM); err != nil {
name := d.Boot2DockerImportVM
// make sure vm is stopped
_ = vbm("controlvm", name, "poweroff")
diskInfo, err := getVMDiskInfo(name)
if err != nil {
return err
}
if _, err := os.Stat(diskInfo.Path); err != nil {
return err
}
if err := vbm("clonehd", diskInfo.Path, d.diskPath()); err != nil {
return err
}
log.Debugf("Importing VM settings...")
vmInfo, err := getVMInfo(name)
if err != nil {
return err
}
d.CPU = vmInfo.CPUs
d.Memory = vmInfo.Memory
log.Debugf("Importing SSH key...")
keyPath := filepath.Join(utils.GetHomeDir(), ".ssh", "id_boot2docker")
if err := utils.CopyFile(keyPath, d.GetSSHKeyPath()); err != nil {
@ -215,6 +237,9 @@ func (d *Driver) Create() error {
return err
}
log.Infof("CPUS: %d", d.CPU)
log.Infof("Mem: %d", d.Memory)
cpus := d.CPU
if cpus < 1 {
cpus = int(runtime.NumCPU())
@ -615,26 +640,6 @@ func zeroFill(w io.Writer, n int64) error {
return nil
}
func (d Driver) importB2DVM(name string) error {
// make sure vm is stopped
_ = vbm("controlvm", name, "poweroff")
diskInfo, err := getVMDiskInfo(name)
if err != nil {
return err
}
if _, err := os.Stat(diskInfo.Path); err != nil {
return err
}
if err := vbm("clonehd", diskInfo.Path, d.diskPath()); err != nil {
return err
}
return nil
}
func getAvailableTCPPort() (int, error) {
port := 0
for i := 0; i <= 10; i++ {

55
drivers/virtualbox/vm.go Normal file
View File

@ -0,0 +1,55 @@
package virtualbox
import (
"bufio"
"io"
"strconv"
"strings"
)
type VirtualBoxVM struct {
CPUs int
Memory int
}
func parseVMInfo(r io.Reader) (*VirtualBoxVM, error) {
s := bufio.NewScanner(r)
vm := &VirtualBoxVM{}
for s.Scan() {
line := s.Text()
if line == "" {
continue
}
res := reEqualLine.FindStringSubmatch(line)
if res == nil {
continue
}
switch key, val := res[1], res[2]; key {
case "cpus":
v, err := strconv.Atoi(val)
if err != nil {
return nil, err
}
vm.CPUs = v
case "memory":
v, err := strconv.Atoi(val)
if err != nil {
return nil, err
}
vm.Memory = v
}
}
if err := s.Err(); err != nil {
return nil, err
}
return vm, nil
}
func getVMInfo(name string) (*VirtualBoxVM, error) {
out, err := vbmOut("showvminfo", name, "--machinereadable")
if err != nil {
return nil, err
}
r := strings.NewReader(out)
return parseVMInfo(r)
}

View File

@ -0,0 +1,38 @@
package virtualbox
import (
"strings"
"testing"
)
var (
testVMInfoText = `
storagecontrollerbootable0="on"
memory=1024
cpus=2
"SATA-0-0"="/home/ehazlett/.boot2docker/boot2docker.iso"
"SATA-IsEjected"="off"
"SATA-1-0"="/home/ehazlett/vm/test/disk.vmdk"
"SATA-ImageUUID-1-0"="12345-abcdefg"
"SATA-2-0"="none"
nic1="nat"
`
)
func TestVMInfo(t *testing.T) {
r := strings.NewReader(testVMInfoText)
vm, err := parseVMInfo(r)
if err != nil {
t.Fatal(err)
}
vmCPUs := 2
vmMemory := 1024
if vm.CPUs != vmCPUs {
t.Fatalf("expected %d cpus; received %d", vmCPUs, vm.CPUs)
}
if vm.Memory != vmMemory {
t.Fatalf("expected memory %d; received %d", vmMemory, vm.Memory)
}
}