mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix: disk copy to storage inherit classmeta (#22215)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
@@ -979,6 +979,13 @@ type ServerChangeDiskStorageInternalInput struct {
|
||||
CloneDiskCount int `json:"disk_count"`
|
||||
}
|
||||
|
||||
type ServerCopyDiskToStorageInput struct {
|
||||
KeepOriginDisk bool `json:"keep_origin_disk"`
|
||||
GuestRunning bool `json:"guest_running"`
|
||||
CompletedDiskCount int `json:"completed_disk_count"`
|
||||
CloneDiskCount int `json:"disk_count"`
|
||||
}
|
||||
|
||||
type ServerSetExtraOptionInput struct {
|
||||
Key string `json:"key"`
|
||||
Value string `json:"value"`
|
||||
|
||||
@@ -5809,7 +5809,21 @@ func (self *SGuest) PerformChangeDiskStorage(ctx context.Context, userCred mccli
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// create a disk on target storage from source disk
|
||||
{
|
||||
copyInput := api.ServerCopyDiskToStorageInput{
|
||||
KeepOriginDisk: input.KeepOriginDisk,
|
||||
GuestRunning: self.Status == api.VM_RUNNING,
|
||||
}
|
||||
err := self.CopyDiskToStorage(ctx, userCred, srcDisk, storage, copyInput, "")
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "CopyDiskToStorage")
|
||||
}
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (guest *SGuest) CopyDiskToStorage(ctx context.Context, userCred mcclient.TokenCredential, srcDisk *SDisk, storage *SStorage, input api.ServerCopyDiskToStorageInput, parentTaskId string) error {
|
||||
diskConf := &api.DiskConfig{
|
||||
Index: -1,
|
||||
ImageId: srcDisk.TemplateId,
|
||||
@@ -5818,19 +5832,39 @@ func (self *SGuest) PerformChangeDiskStorage(ctx context.Context, userCred mccli
|
||||
DiskType: srcDisk.DiskType,
|
||||
}
|
||||
|
||||
targetDisk, err := self.CreateDiskOnStorage(ctx, userCred, storage, diskConf, nil, true, true)
|
||||
targetDisk, err := guest.CreateDiskOnStorage(ctx, userCred, storage, diskConf, nil, true, true)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "Create target disk on storage %s", storage.GetName())
|
||||
return errors.Wrapf(err, "Create target disk on storage %s", storage.GetName())
|
||||
}
|
||||
|
||||
{
|
||||
err := db.InheritFromTo(ctx, userCred, srcDisk, targetDisk)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "Inherit class metadata from src %s to target %s", srcDisk.GetName(), targetDisk.GetName())
|
||||
}
|
||||
}
|
||||
|
||||
internalInput := &api.ServerChangeDiskStorageInternalInput{
|
||||
ServerChangeDiskStorageInput: *input,
|
||||
StorageId: srcDisk.StorageId,
|
||||
TargetDiskId: targetDisk.GetId(),
|
||||
GuestRunning: self.Status == api.VM_RUNNING,
|
||||
ServerChangeDiskStorageInput: api.ServerChangeDiskStorageInput{
|
||||
DiskId: srcDisk.Id,
|
||||
TargetStorageId: storage.Id,
|
||||
KeepOriginDisk: input.KeepOriginDisk,
|
||||
},
|
||||
StorageId: srcDisk.StorageId,
|
||||
TargetDiskId: targetDisk.GetId(),
|
||||
GuestRunning: input.GuestRunning,
|
||||
CloneDiskCount: input.CloneDiskCount,
|
||||
CompletedDiskCount: input.CompletedDiskCount,
|
||||
}
|
||||
|
||||
return nil, self.StartChangeDiskStorageTask(ctx, userCred, internalInput, "")
|
||||
{
|
||||
err := guest.StartChangeDiskStorageTask(ctx, userCred, internalInput, parentTaskId)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "StartChangeDiskStorageTask")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SGuest) StartChangeDiskStorageTask(ctx context.Context, userCred mcclient.TokenCredential, input *api.ServerChangeDiskStorageInternalInput, parentTaskId string) error {
|
||||
|
||||
@@ -381,36 +381,17 @@ func (t *GuestChangeDisksStorageTask) CreateTargetDisk(ctx context.Context, gues
|
||||
return
|
||||
}
|
||||
|
||||
// create a disk on target storage from source disk
|
||||
diskConf := &api.DiskConfig{
|
||||
Index: -1,
|
||||
ImageId: srcDisk.TemplateId,
|
||||
SizeMb: srcDisk.DiskSize,
|
||||
Fs: srcDisk.FsFormat,
|
||||
DiskType: srcDisk.DiskType,
|
||||
}
|
||||
|
||||
targetDisk, err := guest.CreateDiskOnStorage(ctx, t.UserCred, storage, diskConf, nil, true, true)
|
||||
if err != nil {
|
||||
t.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Create target disk on storage %s: %s", storage.GetName(), err)))
|
||||
return
|
||||
}
|
||||
|
||||
internalInput := &api.ServerChangeDiskStorageInternalInput{
|
||||
ServerChangeDiskStorageInput: api.ServerChangeDiskStorageInput{
|
||||
DiskId: srcDisk.Id,
|
||||
TargetStorageId: storage.Id,
|
||||
KeepOriginDisk: input.KeepOriginDisk,
|
||||
},
|
||||
StorageId: srcDisk.StorageId,
|
||||
TargetDiskId: targetDisk.GetId(),
|
||||
GuestRunning: input.GuestRunning,
|
||||
CloneDiskCount: input.DiskCount,
|
||||
CompletedDiskCount: input.DiskCount - len(input.Disks) - 1,
|
||||
}
|
||||
|
||||
if err := guest.StartChangeDiskStorageTask(ctx, t.UserCred, internalInput, t.Id); err != nil {
|
||||
t.TaskFailed(ctx, guest, jsonutils.NewString(err.Error()))
|
||||
return
|
||||
{
|
||||
copyInput := api.ServerCopyDiskToStorageInput{
|
||||
KeepOriginDisk: input.KeepOriginDisk,
|
||||
GuestRunning: input.GuestRunning,
|
||||
CloneDiskCount: input.DiskCount,
|
||||
CompletedDiskCount: input.DiskCount - len(input.Disks) - 1,
|
||||
}
|
||||
err := guest.CopyDiskToStorage(ctx, t.UserCred, srcDisk, storage, copyInput, t.GetTaskId())
|
||||
if err != nil {
|
||||
t.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("CopyDiskToStorage fail: %s", err)))
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user