func doVolumeCreate(c *cli.Context) error { var err error name := c.Args().First() size, err := getSize(c, err) driverName, err := util.GetFlag(c, "driver", false, err) backupURL, err := util.GetFlag(c, "backup", false, err) if err != nil { return err } driverVolumeID := c.String("id") volumeType := c.String("type") iops := c.Int("iops") prepareForVM := c.Bool("vm") request := &api.VolumeCreateRequest{ Name: name, DriverName: driverName, Size: size, BackupURL: backupURL, DriverVolumeID: driverVolumeID, Type: volumeType, IOPS: int64(iops), PrepareForVM: prepareForVM, Verbose: c.GlobalBool(verboseFlag), } url := "/volumes/create" return sendRequestAndPrint("POST", url, request) }
func getSize(c *cli.Context, err error) (int64, error) { size, err := util.GetFlag(c, "size", false, err) if err != nil { return 0, err } return util.ParseSize(size) }
func doBackupDelete(c *cli.Context) error { var err error backupURL, err := util.GetFlag(c, "", true, err) if err != nil { return err } request := &api.BackupDeleteRequest{ URL: backupURL, } url := "/backups" return sendRequestAndPrint("DELETE", url, request) }
func doBackupRestore(c *cli.Context) error { var err error backupURL, err := util.GetFlag(c, "", true, err) if err != nil { return err } backupURL = util.UnescapeURL(backupURL) toFile, err := util.GetFlag(c, "to", true, err) if err != nil { return err } if err := objectstore.RestoreDeltaBlockBackup(backupURL, toFile); err != nil { return err } if err := createNewSnapshotMetafile(toFile + ".meta"); err != nil { return err } return nil }
func doBackupDelete(c *cli.Context) error { var err error backupURL, err := util.GetFlag(c, "", true, err) if err != nil { return err } backupURL = util.UnescapeURL(backupURL) if err := objectstore.DeleteDeltaBlockBackup(backupURL); err != nil { return err } return nil }
func doBackupInspect(c *cli.Context) error { var err error backupURL, err := util.GetFlag(c, "", true, err) if err != nil { return err } request := &api.BackupListRequest{ URL: backupURL, } url := "/backups/inspect" return sendRequestAndPrint("GET", url, request) }
func doBackupList(c *cli.Context) error { var err error destURL, err := util.GetFlag(c, "", true, err) volumeName, err := util.GetName(c, "volume-name", false, err) if err != nil { return err } request := &api.BackupListRequest{ URL: destURL, VolumeName: volumeName, } url := "/backups/list" return sendRequestAndPrint("GET", url, request) }
func doBackupList(c *cli.Context) error { var err error destURL, err := util.GetFlag(c, "", true, err) volumeName, err := util.GetName(c, "volume", false, err) if err != nil { return err } list, err := objectstore.List(volumeName, destURL, DRIVERNAME) if err != nil { return err } fmt.Println(list) return nil }
func doVolumeMount(c *cli.Context) error { var err error volumeUUID, err := getOrRequestUUID(c, "", true) mountPoint, err := util.GetFlag(c, "mountpoint", false, err) if err != nil { return err } request := &api.VolumeMountRequest{ VolumeUUID: volumeUUID, MountPoint: mountPoint, Verbose: c.GlobalBool(verboseFlag), } url := "/volumes/mount" return sendRequestAndPrint("POST", url, request) }
func (s *daemon) doVolumeList(version string, w http.ResponseWriter, r *http.Request, objs map[string]string) error { driverSpecific, err := util.GetFlag(r, "driver", false, nil) if err != nil { return err } var data []byte if driverSpecific == "1" { result := s.getVolumeList() data, err = api.ResponseOutput(&result) } else { data, err = s.listVolume() } if err != nil { return err } _, err = w.Write(data) return err }
func getName(c *cli.Context, key string, required bool) (string, error) { var err error var name string if key == "" { name = c.Args().First() } else { name, err = util.GetFlag(c, key, required, err) if err != nil { return "", err } } if name == "" && !required { return "", nil } if err := util.CheckName(name); err != nil { return "", err } return name, nil }
func doBackupInspect(c *cli.Context) error { var err error backupURL, err := util.GetFlag(c, "", true, err) if err != nil { return err } backupURL = util.UnescapeURL(backupURL) info, err := objectstore.GetBackupInfo(backupURL) if err != nil { return err } data, err := api.ResponseOutput(info) if err != nil { return err } fmt.Println(string(data)) return nil }
func getOrRequestUUID(c *cli.Context, key string, required bool) (string, error) { var err error var id string if key == "" { id = c.Args().First() } else { id, err = util.GetFlag(c, key, required, err) if err != nil { return "", err } } if id == "" && !required { return "", nil } if util.ValidateUUID(id) { return id, nil } return requestUUID(id) }
func doBackupCreate(c *cli.Context) error { var err error destURL, err := util.GetFlag(c, "dest", false, err) if err != nil { return err } snapshotName, err := getName(c, "", true) if err != nil { return err } request := &api.BackupCreateRequest{ URL: destURL, SnapshotName: snapshotName, Verbose: c.GlobalBool(verboseFlag), } url := "/backups/create" return sendRequestAndPrint("POST", url, request) }
func (s *daemon) doVolumeList(version string, w http.ResponseWriter, r *http.Request, objs map[string]string) error { s.GlobalLock.RLock() defer s.GlobalLock.RUnlock() driverSpecific, err := util.GetFlag(r, "driver", false, nil) if err != nil { return err } var data []byte if driverSpecific == "1" { result := make(map[string]map[string]string) for _, driver := range s.ConvoyDrivers { volOps, err := driver.VolumeOps() if err != nil { break } volumes, err := volOps.ListVolume(map[string]string{}) if err != nil { break } for k, v := range volumes { v["Driver"] = driver.Name() result[k] = v } } data, err = api.ResponseOutput(&result) } else { data, err = s.listVolume() } if err != nil { return err } _, err = w.Write(data) return err }
func doBackupCreate(c *cli.Context) error { var ( err error backingFile *replica.BackingFile ) destURL, err := util.GetFlag(c, "dest", true, err) if err != nil { return err } snapshotName, err := getName(c, "", true) if err != nil { return err } volumeName, err := util.GetFlag(c, "volume", true, err) if err != nil { return err } dir, err := os.Getwd() if err != nil { return err } volumeInfo, err := replica.ReadInfo(dir) if err != nil { return err } if volumeInfo.BackingFileName != "" { backingFileName := volumeInfo.BackingFileName if _, err := os.Stat(backingFileName); err != nil { return err } backingFile, err = openBackingFile(backingFileName) if err != nil { return err } } replicaBackup := replica.NewBackup(backingFile) volume := &objectstore.Volume{ Name: volumeName, Driver: DRIVERNAME, Size: volumeInfo.Size, CreatedTime: util.Now(), } snapshot := &objectstore.Snapshot{ Name: snapshotName, CreatedTime: util.Now(), } log.Debugf("Starting backup for %v, snapshot %v, dest %v", volume, snapshot, destURL) backupURL, err := objectstore.CreateDeltaBlockBackup(volume, snapshot, destURL, replicaBackup) if err != nil { return err } fmt.Println(backupURL) return nil }