func (c *Container) reap() { containerSharedDir := filepath.Join(hypervisor.BaseDir, c.ownerPod.vm.Id, hypervisor.ShareDirTag, c.Id) utils.Umount(filepath.Join(containerSharedDir, "rootfs")) os.RemoveAll(containerSharedDir) os.RemoveAll(filepath.Join(c.ownerPod.sv.StateDir, c.Id)) }
func startVContainer(context *nsContext, root, container string) { stateDir := filepath.Join(root, container) err := createVSocket(context, root, container) if err != nil { fmt.Printf("create runv Socket err: %v\n", err) return } sock, ok := context.sockets[container] if !ok { fmt.Printf("can not find runv Socket, container %v\n", container) return } conn, err := sock.Accept() if err != nil { fmt.Printf("accept on runv Socket err: %v\n", err) return } // get config from sock msg, err := hypervisor.ReadVmMessage(conn.(*net.UnixConn)) if err != nil || msg.Code != RUNV_STARTCONTAINER { fmt.Printf("read runv client data failed: %v\n", err) return } config := &startConfig{} err = json.Unmarshal(msg.Message, config) if err != nil || config.Root != root || config.Name != container { fmt.Printf("parse runv start config failed: %v\n", err) return } // start pure pod err = startRunvPod(context, config) if err != nil { fmt.Printf("Start Pod failed: %s\n", err.Error()) return } defer cleanupRunvPod(context, container) // save the state state := &specs.State{ Version: config.LinuxSpec.Spec.Version, ID: container, Pid: -1, BundlePath: config.BundlePath, } stateData, err := json.MarshalIndent(state, "", "\t") if err != nil { fmt.Printf("%s\n", err.Error()) return } stateFile := filepath.Join(stateDir, "state.json") err = ioutil.WriteFile(stateFile, stateData, 0644) if err != nil { fmt.Printf("%s\n", err.Error()) return } userContainer := pod.ConvertOCF2UserContainer(&config.LinuxSpec, &config.LinuxRuntimeSpec) info, err := prepareInfo(config, userContainer, context.vmId) if err != nil { fmt.Printf("%s\n", err.Error()) return } defer func() { rootDir := filepath.Join(hypervisor.BaseDir, context.vmId, hypervisor.ShareDirTag, info.Id, "rootfs") utils.Umount(rootDir) os.RemoveAll(filepath.Join(hypervisor.BaseDir, context.vmId, hypervisor.ShareDirTag, info.Id)) }() tag, _ := runvAllocAndRespondTag(conn) tty := &hypervisor.TtyIO{ ClientTag: tag, Stdin: conn, Stdout: conn, Callback: make(chan *types.VmResponse, 1), } context.Lock() context.ttyList[tag] = tty context.Unlock() err = context.vm.Attach(tty, info.Id, nil) if err != nil { fmt.Printf("StartPod fail: fail to set up tty connection.\n") return } err = execPrestartHooks(&config.LinuxRuntimeSpec.RuntimeSpec, state) if err != nil { fmt.Printf("execute Prestart hooks failed, %s\n", err.Error()) return } context.podStatus.AddContainer(info.Id, context.podId, "", []string{}, types.S_POD_CREATED) context.vm.NewContainer(userContainer, info) ListenAndHandleRunvRequests(context, info, sock) err = execPoststartHooks(&config.LinuxRuntimeSpec.RuntimeSpec, state) if err != nil { fmt.Printf("execute Poststart hooks failed %s\n", err.Error()) } err = tty.WaitForFinish() if err != nil { fmt.Printf("get exit code failed %s\n", err.Error()) } err = execPoststopHooks(&config.LinuxRuntimeSpec.RuntimeSpec, state) if err != nil { fmt.Printf("execute Poststop hooks failed %s\n", err.Error()) return } }