mirror of https://github.com/docker/docs.git
import cpu and memory settings when importing b2d vm
Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
parent
a01322fa77
commit
33eab99e58
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 '(.+)'`)
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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++ {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue