diff --git a/pkg/compute/models/backup.go b/pkg/compute/models/backup.go index 25c31172b4..4f1c868bd6 100644 --- a/pkg/compute/models/backup.go +++ b/pkg/compute/models/backup.go @@ -16,6 +16,7 @@ package models import ( "context" + "database/sql" "reflect" "time" @@ -221,10 +222,23 @@ func (dm *SDiskBackupManager) ValidateCreateData(ctx context.Context, userCred m if disk.Status != api.DISK_READY { return input, httperrors.NewInvalidStatusError("disk %s status is not %s", disk.Name, api.DISK_READY) } - _, err = validators.ValidateModel(userCred, BackupStorageManager, &input.BackupStorageId) + ibs, err := BackupStorageManager.FetchByIdOrName(userCred, input.BackupStorageId) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return input, httperrors.NewResourceNotFoundError2(BackupStorageManager.Keyword(), input.BackupStorageId) + } + if errors.Cause(err) == sqlchemy.ErrDuplicateEntry { + return input, httperrors.NewDuplicateResourceError(BackupStorageManager.Keyword(), input.BackupStorageId) + } + return input, httperrors.NewGeneralError(err) + } if err != nil { return input, err } + bs := ibs.(*SBackupStorage) + if bs.Status != api.BACKUPSTORAGE_STATUS_ONLINE { + return input, httperrors.NewForbiddenError("can't backup guest to backup storage with status %s", bs.Status) + } storage, err := disk.GetStorage() if err != nil { return input, errors.Wrapf(err, "unable to get storage of disk %s", disk.GetId()) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index a2fe2f7660..d79dd27a9a 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -4748,9 +4748,19 @@ func (self *SGuest) PerformInstanceBackup(ctx context.Context, userCred mcclient if backupStorageId == "" { return nil, httperrors.NewMissingParameterError("backup_storage_id") } - _, err = BackupStorageManager.FetchById(backupStorageId) - if err == sql.ErrNoRows { - return nil, httperrors.NewInputParameterError("unkown backup_storage_id %s", backupStorageId) + ibs, err := BackupStorageManager.FetchByIdOrName(userCred, backupStorageId) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(BackupStorageManager.Keyword(), backupStorageId) + } + if errors.Cause(err) == sqlchemy.ErrDuplicateEntry { + return nil, httperrors.NewDuplicateResourceError(BackupStorageManager.Keyword(), backupStorageId) + } + return nil, httperrors.NewGeneralError(err) + } + bs := ibs.(*SBackupStorage) + if bs.Status != api.BACKUPSTORAGE_STATUS_ONLINE { + return nil, httperrors.NewForbiddenError("can't backup guest to backup storage with status %s", bs.Status) } instanceBackup, err := InstanceBackupManager.CreateInstanceBackup(ctx, userCred, self, name, backupStorageId) if err != nil {