feat(region): support for forced deletion of instance backups

This commit is contained in:
rainzm
2022-03-07 17:38:41 +08:00
parent c2be07be27
commit 7270d0f19b
8 changed files with 57 additions and 14 deletions
+2 -2
View File
@@ -34,7 +34,7 @@ func init() {
dbCmd := shell.NewResourceCmd(&modules.DiskBackups)
dbCmd.List(&compute.DiskBackupListOptions{})
dbCmd.Show(&compute.DiskBackupIdOptions{})
dbCmd.Delete(&compute.DiskBackupIdOptions{})
dbCmd.DeleteWithParam(&compute.DiskBackupDeleteOptions{})
dbCmd.Create(&compute.DiskBackupCreateOptions{})
dbCmd.Perform("recovery", &compute.DiskBackupRecoveryOptions{})
dbCmd.Perform("syncstatus", &compute.DiskBackupSyncstatusOptions{})
@@ -42,7 +42,7 @@ func init() {
ibCmd := shell.NewResourceCmd(&modules.InstanceBackups)
ibCmd.List(&compute.InstanceBackupListOptions{})
ibCmd.Show(&compute.InstanceBackupIdOptions{})
ibCmd.Delete(&compute.InstanceBackupIdOptions{})
ibCmd.DeleteWithParam(&compute.InstanceBackupDeleteOptions{})
ibCmd.Perform("recovery", &compute.InstanceBackupRecoveryOptions{})
ibCmd.Perform("pack", &compute.InstanceBackupPackOptions{})
ibCmd.PerformClass("create-from-package", &compute.InstanceBackupManagerCreateFromPackageOptions{})
+4
View File
@@ -44,6 +44,10 @@ const (
BACKUP_NOT_EXIST = "not_exist"
)
const (
BackupStorageOffline = "backup storage offline"
)
type BackupStorageCreateInput struct {
apis.EnabledStatusInfrasResourceBaseCreateInput
+8 -3
View File
@@ -370,13 +370,18 @@ func (self *SDiskBackup) RealDelete(ctx context.Context, userCred mcclient.Token
}
func (self *SDiskBackup) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
return self.StartBackupDeleteTask(ctx, userCred, "")
forceDelete := jsonutils.QueryBoolean(query, "force", false)
return self.StartBackupDeleteTask(ctx, userCred, "", forceDelete)
}
func (self *SDiskBackup) StartBackupDeleteTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error {
func (self *SDiskBackup) StartBackupDeleteTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string, forceDelete bool) error {
self.SetStatus(userCred, api.BACKUP_STATUS_DELETING, "")
log.Infof("start to delete diskbackup %s and set deleting", self.GetId())
task, err := taskman.TaskManager.NewTask(ctx, "DiskBackupDeleteTask", self, userCred, nil, parentTaskId, "", nil)
params := jsonutils.NewDict()
if forceDelete {
params.Set("force_delete", jsonutils.JSONTrue)
}
task, err := taskman.TaskManager.NewTask(ctx, "DiskBackupDeleteTask", self, userCred, params, parentTaskId, "", nil)
if err != nil {
return err
} else {
+8 -5
View File
@@ -376,14 +376,17 @@ func (self *SInstanceBackup) ValidateDeleteCondition(ctx context.Context, info j
func (self *SInstanceBackup) CustomizeDelete(
ctx context.Context, userCred mcclient.TokenCredential,
query jsonutils.JSONObject, data jsonutils.JSONObject) error {
return self.StartInstanceBackupDeleteTask(ctx, userCred, "")
forceDelete := jsonutils.QueryBoolean(query, "force", false)
return self.StartInstanceBackupDeleteTask(ctx, userCred, "", forceDelete)
}
func (self *SInstanceBackup) StartInstanceBackupDeleteTask(
ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error {
task, err := taskman.TaskManager.NewTask(ctx, "InstanceBackupDeleteTask", self, userCred, nil, parentTaskId, "", nil)
ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string, forceDelete bool) error {
params := jsonutils.NewDict()
if forceDelete {
params.Set("force_delete", jsonutils.JSONTrue)
}
task, err := taskman.TaskManager.NewTask(ctx, "InstanceBackupDeleteTask", self, userCred, params, parentTaskId, "", nil)
if err != nil {
log.Errorf("%s", err)
return err
+2 -1
View File
@@ -1056,7 +1056,8 @@ func (self *SKVMRegionDriver) RequestDeleteInstanceBackup(ctx context.Context, i
params := jsonutils.NewDict()
params.Set("del_backup_id", jsonutils.NewString(backups[0].Id))
task.SetStage("OnKvmDiskBackupDelete", params)
err = backups[0].StartBackupDeleteTask(ctx, task.GetUserCred(), task.GetTaskId())
forceDelete := jsonutils.QueryBoolean(task.GetParams(), "force_delete", false)
err = backups[0].StartBackupDeleteTask(ctx, task.GetUserCred(), task.GetTaskId(), forceDelete)
if err != nil {
return err
}
+13 -1
View File
@@ -16,8 +16,10 @@ package tasks
import (
"context"
"strings"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
@@ -64,5 +66,15 @@ func (self *DiskBackupDeleteTask) OnDelete(ctx context.Context, backup *models.S
}
func (self *DiskBackupDeleteTask) OnDeleteFailed(ctx context.Context, backup *models.SDiskBackup, data jsonutils.JSONObject) {
self.taskFailed(ctx, backup, data)
log.Infof("params: %s", self.Params)
log.Infof("OnDeleteFailed data: %s", data)
if forceDelete := jsonutils.QueryBoolean(self.Params, "force_delete", false); !forceDelete {
self.taskFailed(ctx, backup, data)
}
reason, _ := data.GetString("__reason__")
if !strings.Contains(reason, api.BackupStorageOffline) {
self.taskFailed(ctx, backup, data)
}
log.Infof("delete backup %s failed, force delete", backup.GetId())
self.taskSuccess(ctx, backup, nil)
}
@@ -37,7 +37,7 @@ import (
const BackupStoragePath = "/opt/cloud/workspace/backupstorage"
var ErrorBackupStorageOffline error = errors.Error("backup storage offline")
var ErrorBackupStorageOffline error = errors.Error(api.BackupStorageOffline)
type SNFSBackupStorage struct {
BackupStorageId string
+19 -1
View File
@@ -43,6 +43,15 @@ func (opts *DiskBackupIdOptions) Params() (jsonutils.JSONObject, error) {
return nil, nil
}
type DiskBackupDeleteOptions struct {
DiskBackupIdOptions
Force bool `help:"force delete"`
}
func (opts *DiskBackupDeleteOptions) QueryParams() (jsonutils.JSONObject, error) {
return jsonutils.Marshal(opts), nil
}
type DiskBackupCreateOptions struct {
options.BaseCreateOptions
DISKID string `help:"disk id" json:"disk_id"`
@@ -121,7 +130,7 @@ func (opts *InstanceBackupListOptions) Params() (jsonutils.JSONObject, error) {
}
type InstanceBackupIdOptions struct {
ID string `help:"instance backup id"`
ID string `help:"instance backup id" json:"-"`
}
func (opts *InstanceBackupIdOptions) GetId() string {
@@ -132,6 +141,15 @@ func (opts *InstanceBackupIdOptions) Params() (jsonutils.JSONObject, error) {
return nil, nil
}
type InstanceBackupDeleteOptions struct {
InstanceBackupIdOptions
Force bool `help:"force delete"`
}
func (opts *InstanceBackupDeleteOptions) QueryParams() (jsonutils.JSONObject, error) {
return jsonutils.Marshal(opts), nil
}
type InstanceBackupRecoveryOptions struct {
DiskBackupIdOptions
Name string `help:"server name" json:"name"`