func Delete(name string) error { var err error instanceName, instancePlatform := util.SearchInstance(name) if instanceName == "" { fmt.Printf("Instance: %s not found\n", name) return nil } switch instancePlatform { case "qemu": qemu.StopVM(name) err = qemu.DeleteVM(name) case "vbox": vbox.StopVM(name) err = vbox.DeleteVM(name) case "vmw": vmw.StopVM(name) err = vmw.DeleteVM(name) case "gce": gce.StopVM(name) err = gce.DeleteVM(name) } if err != nil { fmt.Printf("Failed to delete instance: %s\n", name) return err } fmt.Printf("Deleted instance: %s\n", name) return nil }
func deleteInstance(name string) error { instanceName, instancePlatform := util.SearchInstance(name) if instanceName == "" { return nil } var err error switch instancePlatform { case "qemu": err = qemu.DeleteVM(name) case "vbox": err = vbox.DeleteVM(name) case "vmw": err = vmw.DeleteVM(name) case "gce": err = gce.DeleteVM(name) } return err }
func Run(repo *util.Repo, config *RunConfig) error { var path string if config.ImageName != "" { if _, err := os.Stat(config.ImageName); os.IsNotExist(err) { if repo.ImageExists(config.Hypervisor, config.ImageName) { path = repo.ImagePath(config.Hypervisor, config.ImageName) } else if util.IsRemoteImage(config.ImageName) { err := Pull(repo, config.Hypervisor, config.ImageName) if err != nil { return err } path = repo.ImagePath(config.Hypervisor, config.ImageName) } else { return fmt.Errorf("%s: no such image", config.ImageName) } } else { path = config.ImageName } } else { config.ImageName = repo.DefaultImage() if config.ImageName == "" { return fmt.Errorf("No Capstanfile found, unable to run.") } if !repo.ImageExists(config.Hypervisor, config.ImageName) { if !util.ConfigExists("Capstanfile") { return fmt.Errorf("%s: no such image", config.ImageName) } err := Build(repo, config.Hypervisor, config.ImageName, config.Verbose) if err != nil { return err } } path = repo.ImagePath(config.Hypervisor, config.ImageName) } format, err := image.Probe(path) if err != nil { return err } if format == image.Unknown { return fmt.Errorf("%s: image format not recognized, unable to run it.", path) } size, err := util.ParseMemSize(config.Memory) if err != nil { return err } var cmd *exec.Cmd switch config.Hypervisor { case "qemu": id := util.ID() dir := filepath.Join(os.Getenv("HOME"), ".capstan/instances/qemu", id) config := &qemu.VMConfig{ Name: id, Image: path, Verbose: true, Memory: size, Cpus: config.Cpus, NatRules: config.NatRules, BackingFile: true, InstanceDir: dir, Monitor: filepath.Join(dir, "osv.monitor"), } fmt.Printf("Created instance: %s\n", id) tio, _ := util.RawTerm() defer util.ResetTerm(tio) cmd, err = qemu.LaunchVM(config) defer qemu.DeleteVM(config) case "vbox": if format != image.VDI && format != image.VMDK { return fmt.Errorf("%s: image format of %s is not supported, unable to run it.", config.Hypervisor, path) } id := util.ID() config := &vbox.VMConfig{ Name: id, Dir: filepath.Join(util.HomePath(), ".capstan/instances/vbox"), Image: path, Memory: size, Cpus: config.Cpus, NatRules: config.NatRules, } fmt.Printf("Created instance: %s\n", id) tio, _ := util.RawTerm() defer util.ResetTerm(tio) cmd, err = vbox.LaunchVM(config) defer vbox.DeleteVM(config) case "gce": id := util.ID() bucket := "osvimg" config := &gce.VMConfig{ Name: "osv-capstan-" + id, Image: "osv-capstan-" + id, Network: "default", MachineType: "n1-standard-1", Zone: "us-central1-a", CloudStoragePath: "gs://" + bucket + "/osv-capstan-" + id + ".tar.gz", Tarball: path, } cmd, err = gce.LaunchVM(config) case "vmw": id := util.ID() if format != image.VMDK { return fmt.Errorf("%s: image format of %s is not supported, unable to run it.", config.Hypervisor, path) } dir := filepath.Join(util.HomePath(), ".capstan/instances/vmw", id) config := &vmw.VMConfig{ Name: id, Dir: dir, Image: filepath.Join(dir, "osv.vmdk"), Memory: size, Cpus: config.Cpus, NatRules: config.NatRules, VMXFile: filepath.Join(dir, "osv.vmx"), InstanceDir: dir, OriginalVMDK: path, } fmt.Printf("Created instance: %s\n", id) tio, _ := util.RawTerm() defer util.ResetTerm(tio) cmd, err = vmw.LaunchVM(config) defer vmw.DeleteVM(config) default: err = fmt.Errorf("%s: is not a supported hypervisor", config.Hypervisor) } if err != nil { return err } if cmd != nil { return cmd.Wait() } else { return nil } }