func (daemon *Daemon) CreatePod(podId, podArgs string, config interface{}, autoremove bool) (err error) { glog.V(1).Infof("podArgs: %s", podArgs) var ( userPod *pod.UserPod containerIds []string cId []byte ) userPod, err = pod.ProcessPodBytes([]byte(podArgs)) if err != nil { glog.V(1).Infof("Process POD file error: %s", err.Error()) return err } if err = userPod.Validate(); err != nil { return err } mypod := hypervisor.NewPod(podId, userPod) mypod.Handler.Handle = hyperHandlePodEvent mypod.Handler.Data = daemon mypod.Autoremove = autoremove defer func() { if err != nil { if containerIds == nil { daemon.DeletePodFromDB(podId) if mypod != nil { for _, c := range mypod.Containers { glog.V(1).Infof("Ready to rm container: %s", c.Id) if _, _, err = daemon.DockerCli.SendCmdDelete(c.Id); err != nil { glog.Warningf("Error to rm container: %s", err.Error()) } } } daemon.RemovePod(podId) daemon.DeletePodContainerFromDB(podId) } } }() // store the UserPod into the db if err = daemon.WritePodToDB(podId, []byte(podArgs)); err != nil { glog.V(1).Info("Found an error while saveing the POD file") return err } containerIds, err = daemon.GetPodContainersByName(podId) if err != nil { glog.V(1).Info(err.Error()) } if containerIds != nil { for _, id := range containerIds { var ( name string image string ) if jsonResponse, err := daemon.DockerCli.GetContainerInfo(id); err == nil { name = jsonResponse.Name image = jsonResponse.Config.Image } mypod.AddContainer(id, name, image, []string{}, types.S_POD_CREATED) } } else { // Process the 'Containers' section glog.V(1).Info("Process the Containers section in POD SPEC\n") for _, c := range userPod.Containers { imgName := c.Image cId, _, err = daemon.DockerCli.SendCmdCreate(c.Name, imgName, []string{}, nil) if err != nil { glog.Error(err.Error()) return err } var ( name string image string ) if jsonResponse, err := daemon.DockerCli.GetContainerInfo(string(cId)); err == nil { name = jsonResponse.Name image = jsonResponse.Config.Image } mypod.AddContainer(string(cId), name, image, []string{}, types.S_POD_CREATED) } } daemon.AddPod(mypod) if err = daemon.WritePodAndContainers(podId); err != nil { glog.V(1).Info("Found an error while saveing the Containers info") return err } return nil }