diff --git a/pkg/apis/compute/snapshot.go b/pkg/apis/compute/snapshot.go index 5321647817..9846a1685d 100644 --- a/pkg/apis/compute/snapshot.go +++ b/pkg/apis/compute/snapshot.go @@ -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"` diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index dc1cedaf83..07f877443e 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -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 {