func createHyperPod(f factory.Factory, spec *specs.Spec, defaultCpus int, defaultMemory int) (*HyperPod, error) { podId := fmt.Sprintf("pod-%s", pod.RandStr(10, "alpha")) userPod := pod.ConvertOCF2PureUserPod(spec) podStatus := hypervisor.NewPod(podId, userPod, nil) cpu := defaultCpus if userPod.Resource.Vcpu > 0 { cpu = userPod.Resource.Vcpu } mem := defaultMemory if userPod.Resource.Memory > 0 { mem = userPod.Resource.Memory } kernel := chooseKernel(spec) initrd := chooseInitrd(spec) glog.V(3).Infof("Using kernel: %s; Initrd: %s; vCPU: %d; Memory %d", kernel, initrd, cpu, mem) var ( vm *hypervisor.Vm err error ) if len(kernel) == 0 && len(initrd) == 0 { vm, err = f.GetVm(cpu, mem) if err != nil { glog.V(1).Infof("Create VM failed with default kernel config: %s", err.Error()) return nil, err } glog.V(3).Infof("Creating VM with default kernel config") } else if len(kernel) == 0 || len(initrd) == 0 { // if user specify a kernel, they must specify an initrd at the same time return nil, fmt.Errorf("You must specify an initrd if you specify a kernel, or vice-versa") } else { boot := &hypervisor.BootConfig{ CPU: cpu, Memory: mem, Kernel: kernel, Initrd: initrd, } vm, err = hypervisor.GetVm("", boot, true, false) if err != nil { glog.V(1).Infof("Create VM failed: %s", err.Error()) return nil, err } glog.V(3).Infof("Creating VM with specific kernel config") } Response := vm.StartPod(podStatus, userPod, nil, nil) if Response.Data == nil { vm.Kill() glog.V(1).Infof("StartPod fail: QEMU response data is nil\n") return nil, fmt.Errorf("StartPod fail") } glog.V(1).Infof("result: code %d %s\n", Response.Code, Response.Cause) hp := &HyperPod{ userPod: userPod, podStatus: podStatus, vm: vm, Containers: make(map[string]*Container), Processes: make(map[string]*Process), } // create Listener process running in its own netns if err = hp.startNsListener(); err != nil { hp.reap() glog.V(1).Infof("start ns listener fail: %s\n", err.Error()) return nil, err } return hp, nil }
func startRunvPod(context *nsContext, config *startConfig) (err error) { context.lock.Lock() defer context.lock.Unlock() if context.firstConfig == nil { context.firstConfig = config } else { // check stopped if len(context.actives) == 0 { return fmt.Errorf("The namespace service was stopped") } // check match if config.Root != "" && config.Root != context.firstConfig.Root { return fmt.Errorf("The root is not match") } if config.Driver != "" && config.Driver != context.firstConfig.Driver { return fmt.Errorf("The driver is not match") } if config.Kernel != "" && config.Kernel != context.firstConfig.Kernel { return fmt.Errorf("The kernel is not match") } if config.Initrd != "" && config.Initrd != context.firstConfig.Initrd { return fmt.Errorf("The initrd is not match") } if config.Vbox != "" && config.Vbox != context.firstConfig.Vbox { return fmt.Errorf("The vbox is not match") } // check shared namespace for _, ns := range config.LinuxRuntimeSpec.Linux.Namespaces { if ns.Path == "" { continue } _, ok := context.actives[ns.Path] if !ok { return fmt.Errorf("Cann't share namespace with: %s", ns.Path) } } // OK, the pod has been started, add this config and return context.actives[config.Name] = config return nil } hypervisor.InterfaceCount = 0 driver := config.Driver if hypervisor.HDriver, err = driverloader.Probe(driver); err != nil { fmt.Printf("%s\n", err.Error()) return err } context.podId = fmt.Sprintf("pod-%s", pod.RandStr(10, "alpha")) context.vmId = fmt.Sprintf("vm-%s", pod.RandStr(10, "alpha")) context.userPod = pod.ConvertOCF2PureUserPod(&config.LinuxSpec, &config.LinuxRuntimeSpec) context.podStatus = hypervisor.NewPod(context.podId, context.userPod) context.vm, err = startVm(config, context.userPod, context.vmId) if err != nil { fmt.Printf("%s\n", err.Error()) return err } Response := context.vm.StartPod(context.podStatus, context.userPod, nil, nil) if Response.Data == nil { fmt.Printf("StartPod fail: QEMU response data is nil\n") return fmt.Errorf("StartPod fail") } fmt.Printf("result: code %d %s\n", Response.Code, Response.Cause) context.actives[config.Name] = config return nil }