func New(templateRoot string, cpu, mem int, kernel, initrd string) base.Factory { var vmName string for { vmName = fmt.Sprintf("template-vm-%s", utils.RandStr(10, "alpha")) if _, err := os.Stat(templateRoot + "/" + vmName); os.IsNotExist(err) { break } } s, err := template.CreateTemplateVM(templateRoot+"/"+vmName, vmName, cpu, mem, kernel, initrd) if err != nil { glog.Infof("failed to create template factory: %v", err) glog.Infof("use direct factory instead") return direct.New(cpu, mem, kernel, initrd) } return &templateFactory{s: s} }
func GetVm(vmId string, b *BootConfig, waitStarted, lazy bool) (vm *Vm, err error) { id := vmId if id == "" { for { id = fmt.Sprintf("vm-%s", utils.RandStr(10, "alpha")) if _, err = os.Stat(BaseDir + "/" + id); os.IsNotExist(err) { break } } } vm = NewVm(id, b.CPU, b.Memory, lazy) if err = vm.Launch(b); err != nil { return nil, err } if waitStarted { // wait init connected Status, err := vm.GetResponseChan() if err != nil { vm.Kill() return nil, err } defer vm.ReleaseResponseChan(Status) for { vmResponse, ok := <-Status if !ok || vmResponse.Code == types.E_FAILED { vm.Kill() return nil, err } if vmResponse.Code == types.E_VM_RUNNING { break } } } return vm, nil }