This commit is contained in:
wanyaoqi
2018-09-12 19:47:38 +08:00
parent 03d7534c42
commit ea8b178fcb
5 changed files with 26 additions and 19 deletions
+1 -1
View File
@@ -11,6 +11,6 @@ import (
type SBaseHostDriver struct {
}
func (self *SBaseHostDriver) RequestDeleteSnapshotWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error {
func (self *SBaseHostDriver) RequestDeleteSnapshotsWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error {
return fmt.Errorf("Not Implement")
}
+1 -1
View File
@@ -149,7 +149,7 @@ func (self *SKVMHostDriver) RequestSaveUploadImageOnHost(ctx context.Context, ho
return err
}
func (self *SKVMHostDriver) RequestDeleteSnapshotWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error {
func (self *SKVMHostDriver) RequestDeleteSnapshotsWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error {
url := fmt.Sprintf("/storages/%s/delete-snapshots", snapshot.StorageId)
body := jsonutils.NewDict()
body.Set("disk_id", jsonutils.NewString(snapshot.DiskId))
+1 -1
View File
@@ -18,7 +18,7 @@ type IHostDriver interface {
RequestDeallocateDiskOnHost(host *SHost, storage *SStorage, disk *SDisk, task taskman.ITask) error
RequestResizeDiskOnHostOnline(host *SHost, storage *SStorage, disk *SDisk, size int64, task taskman.ITask) error
RequestResizeDiskOnHost(host *SHost, storage *SStorage, disk *SDisk, size int64, task taskman.ITask) error
RequestDeleteSnapshotWithStorage(ctx context.Context, host *SHost, snapshot *SSnapshot, task taskman.ITask) error
RequestDeleteSnapshotsWithStorage(ctx context.Context, host *SHost, snapshot *SSnapshot, task taskman.ITask) error
}
var hostDrivers map[string]IHostDriver
+16 -2
View File
@@ -2,6 +2,7 @@ package models
import (
"context"
"database/sql"
"fmt"
"yunion.io/x/jsonutils"
@@ -92,10 +93,19 @@ func (self *SSnapshot) GetGuest() (*SGuest, error) {
} else if len(guests) == 1 {
return &guests[0], nil
} else {
return nil, nil
return nil, sql.ErrNoRows
}
}
func (self *SSnapshot) GetDisk() (*SDisk, error) {
iDisk, err := DiskManager.FetchById(self.DiskId)
if err != nil {
return nil, err
}
disk := iDisk.(*SDisk)
return disk, nil
}
func (self *SSnapshot) GetHost() *SHost {
iStorage, err := StorageManager.FetchById(self.StorageId)
if err != nil {
@@ -204,6 +214,10 @@ func (self *SSnapshot) CustomizeDelete(ctx context.Context, userCred mcclient.To
if !self.FakeDeleted {
return self.FakeDelete()
} else {
_, err := SnapshotManager.GetConvertSnapshot(self)
if err != nil {
httperrors.NewBadRequestError("Snapshot dosen't have convert snapshot, use disk-delete-snapshots")
}
return self.StartSnapshotDeleteTask(ctx, userCred, false, "")
}
} else {
@@ -280,7 +294,7 @@ func (self *SSnapshotManager) PerformDeleteDiskSnapshots(ctx context.Context, us
}
func (self *SSnapshot) StartSnapshotsDeleteTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error {
task, err := taskman.TaskManager.NewTask(ctx, "BatchSnapshostDeleteTask", self, userCred, nil, parentTaskId, "", nil)
task, err := taskman.TaskManager.NewTask(ctx, "BatchSnapshotsDeleteTask", self, userCred, nil, parentTaskId, "", nil)
if err != nil {
log.Errorf(err.Error())
return err
+7 -14
View File
@@ -19,7 +19,7 @@ type GuestDiskSnapshotTask struct {
func init() {
taskman.RegisterTask(GuestDiskSnapshotTask{})
taskman.RegisterTask(SnapshotDeleteTask{})
taskman.RegisterTask(BatchSnapshostDeleteTask{})
taskman.RegisterTask(BatchSnapshotsDeleteTask{})
}
func (self *GuestDiskSnapshotTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
@@ -114,6 +114,7 @@ func (self *SnapshotDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneMo
self.SetStageFailed(ctx, err.Error())
return
} else {
// if snapshot is not used
self.DeleteStaticSnapshot(ctx, snapshot)
return
}
@@ -169,14 +170,6 @@ func (self *SnapshotDeleteTask) StartDeleteSnapshot(ctx context.Context, snapsho
}
func (self *SnapshotDeleteTask) DeleteStaticSnapshot(ctx context.Context, snapshot *models.SSnapshot) {
// convertSnapshot, err := models.SnapshotManager.GetConvertSnapshot(snapshot)
// if err != nil {
// self.TaskFailed(ctx, snapshot, err.Error())
// return
// }
// if convertSnapshot == nil {
// self.TaskFailed(ctx, snapshot, "Snapshot dose not have convert snapshot")
// }
err := snapshot.FakeDelete()
if err != nil {
self.TaskFailed(ctx, snapshot, err.Error())
@@ -258,29 +251,29 @@ func (self *SnapshotDeleteTask) TaskFailed(ctx context.Context, snapshot *models
guest.StartSyncstatus(ctx, self.UserCred, "")
}
type BatchSnapshostDeleteTask struct {
type BatchSnapshotsDeleteTask struct {
taskman.STask
}
func (self *BatchSnapshostDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
func (self *BatchSnapshotsDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
snapshot := obj.(*models.SSnapshot)
self.StartStorageDeleteSnapshot(ctx, snapshot)
}
func (self *BatchSnapshostDeleteTask) StartStorageDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot) {
func (self *BatchSnapshotsDeleteTask) StartStorageDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot) {
host := snapshot.GetHost()
if host == nil {
self.SetStageFailed(ctx, "Cannot found snapshot host")
return
}
self.SetStage("OnStorageDeleteSnapshot", nil)
err := host.GetHostDriver().RequestDeleteSnapshotWithStorage(ctx, host, snapshot, self)
err := host.GetHostDriver().RequestDeleteSnapshotsWithStorage(ctx, host, snapshot, self)
if err != nil {
self.SetStageFailed(ctx, err.Error())
}
}
func (self *BatchSnapshostDeleteTask) OnStorageDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot, data jsonutils.JSONObject) {
func (self *BatchSnapshotsDeleteTask) OnStorageDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot, data jsonutils.JSONObject) {
snapshots := models.SnapshotManager.GetDiskSnapshots(snapshot.DiskId)
for i := 0; i < len(snapshots); i++ {
snapshots[i].RealDelete(ctx, self.UserCred)