mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix(region): validate disk status when create snapshot
This commit is contained in:
@@ -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"`
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user