fix(region): validate disk status when create snapshot

This commit is contained in:
Qu Xuan
2021-06-08 20:04:50 +08:00
parent 82f969e408
commit 82af2f702b
2 changed files with 20 additions and 26 deletions
+3 -3
View File
@@ -19,13 +19,13 @@ import "yunion.io/x/onecloud/pkg/apis"
type SnapshotCreateInput struct {
apis.VirtualResourceCreateInput
// 磁盘名称或Id,建议使用Id
// 磁盘Id
// 目前仅VMware平台不支持创建快照,其余平台磁盘均支持创建快照
// required: true
Disk string `json:"disk"`
// swagger:ignore
DiskId string `json:"disk_id"`
// swagger:ignore
Disk string `json:"disk" yunion-deprecated-by:"disk_id"`
// swagger:ignore
StorageId string `json:"storage_id"`
// swagger:ignore
CreatedBy string `json:"created_by"`
+17 -23
View File
@@ -33,6 +33,7 @@ import (
"yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
"yunion.io/x/onecloud/pkg/cloudcommon/db/quotas"
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
"yunion.io/x/onecloud/pkg/cloudcommon/validators"
"yunion.io/x/onecloud/pkg/cloudprovider"
"yunion.io/x/onecloud/pkg/compute/options"
"yunion.io/x/onecloud/pkg/httperrors"
@@ -341,26 +342,19 @@ func (manager *SSnapshotManager) ValidateCreateData(
ownerId mcclient.IIdentityProvider,
query jsonutils.JSONObject,
input api.SnapshotCreateInput,
) (*jsonutils.JSONDict, error) {
for _, disk := range []string{input.Disk, input.DiskId} {
if len(disk) > 0 {
input.Disk = disk
break
}
) (api.SnapshotCreateInput, error) {
if len(input.DiskId) == 0 {
return input, httperrors.NewMissingParameterError("disk_id")
}
if len(input.Disk) == 0 {
return nil, httperrors.NewMissingParameterError("disk")
_disk, err := validators.ValidateModel(userCred, DiskManager, &input.DiskId)
if err != nil {
return input, err
}
_disk, err := DiskManager.FetchByIdOrName(userCred, input.Disk)
if err != nil {
if err == sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError("failed to found disk %s", input.Disk)
}
return nil, httperrors.NewGeneralError(errors.Wrap(err, "DiskManager.FetchByIdOrName"))
}
disk := _disk.(*SDisk)
input.DiskId = disk.Id
if disk.Status != api.DISK_READY {
return input, httperrors.NewInvalidStatusError("disk %s status is not %s", disk.Name, api.DISK_READY)
}
input.DiskType = disk.DiskType
input.Size = disk.DiskSize
input.OsArch = disk.OsArch
@@ -372,38 +366,38 @@ func (manager *SSnapshotManager) ValidateCreateData(
input.ManagerId = storage.ManagerId
region := storage.GetRegion()
if region == nil {
return nil, httperrors.NewInputParameterError("failed to found region for disk's storage %s(%s)", storage.Name, storage.Id)
return input, httperrors.NewInputParameterError("failed to found region for disk's storage %s(%s)", storage.Name, storage.Id)
}
input.CloudregionId = region.Id
driver, err := storage.GetRegionDriver()
if err != nil {
return nil, errors.Wrap(err, "storage.GetRegionDriver")
return input, errors.Wrap(err, "storage.GetRegionDriver")
}
input.OutOfChain = driver.SnapshotIsOutOfChain(disk)
err = driver.ValidateCreateSnapshotData(ctx, userCred, disk, storage, &input)
if err != nil {
return nil, errors.Wrap(err, "driver.ValidateCreateSnapshotData")
return input, errors.Wrap(err, "driver.ValidateCreateSnapshotData")
}
input.VirtualResourceCreateInput, err = manager.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.VirtualResourceCreateInput)
if err != nil {
return nil, err
return input, err
}
pendingUsage := &SRegionQuota{Snapshot: 1}
keys, err := disk.GetQuotaKeys()
if err != nil {
return nil, err
return input, err
}
pendingUsage.SetKeys(keys.(SComputeResourceKeys).SRegionalCloudResourceKeys)
err = quotas.CheckSetPendingQuota(ctx, userCred, pendingUsage)
if err != nil {
return nil, err
return input, err
}
return input.JSON(input), nil
return input, nil
}
func (self *SSnapshot) CustomizeCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) error {