mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
feat: respect params.Disks when cloning vm
This commit is contained in:
+61
-12
@@ -1002,7 +1002,6 @@ func (host *SHost) CloneVM(ctx context.Context, from *SVirtualMachine, ds *SData
|
||||
}
|
||||
}
|
||||
|
||||
var rootDiskSizeMb int64
|
||||
if len(params.Disks) > 0 {
|
||||
driver := params.Disks[0].Driver
|
||||
if driver == "scsi" || driver == "pvscsi" {
|
||||
@@ -1029,11 +1028,6 @@ func (host *SHost) CloneVM(ctx context.Context, from *SVirtualMachine, ds *SData
|
||||
deviceChange = append(deviceChange, addDevSpec(NewIDEDev(200, 1)))
|
||||
}
|
||||
}
|
||||
|
||||
rootDiskSizeMb = params.Disks[0].Size
|
||||
if rootDiskSizeMb == 0 {
|
||||
rootDiskSizeMb = 30 * 1024
|
||||
}
|
||||
}
|
||||
|
||||
dc, err := host.GetDatacenter()
|
||||
@@ -1098,15 +1092,70 @@ func (host *SHost) CloneVM(ctx context.Context, from *SVirtualMachine, ds *SData
|
||||
if vm == nil {
|
||||
return nil, errors.Error("clone successfully but unable to NewVirtualMachine")
|
||||
}
|
||||
// resize system disk
|
||||
if rootDiskSizeMb > 0 && int64(vm.vdisks[0].GetDiskSizeMB()) != rootDiskSizeMb {
|
||||
err = vm.vdisks[0].Resize(ctx, rootDiskSizeMb)
|
||||
if err != nil {
|
||||
return vm, errors.Wrap(err, "resize for root disk")
|
||||
|
||||
deviceChange = make([]types.BaseVirtualDeviceConfigSpec, 0, 5)
|
||||
// adjust disk
|
||||
var i int
|
||||
if len(params.Disks) > 0 {
|
||||
// resize system disk
|
||||
sysDiskSize := params.Disks[0].Size
|
||||
if sysDiskSize == 0 {
|
||||
sysDiskSize = 30 * 1024
|
||||
}
|
||||
if int64(vm.vdisks[0].GetDiskSizeMB()) != sysDiskSize {
|
||||
vdisk := vm.vdisks[0].getVirtualDisk()
|
||||
originSize := vdisk.CapacityInKB
|
||||
vdisk.CapacityInKB = sysDiskSize * 1024
|
||||
spec := &types.VirtualDeviceConfigSpec{}
|
||||
spec.Operation = types.VirtualDeviceConfigSpecOperationEdit
|
||||
spec.Device = vdisk
|
||||
deviceChange = append(deviceChange, spec)
|
||||
log.Infof("resize system disk: %dGB => %dGB", originSize/1024/1024, sysDiskSize/1024)
|
||||
}
|
||||
// resize existed disk
|
||||
for i = 1; i < len(params.Disks); i++ {
|
||||
if i >= len(vm.vdisks) {
|
||||
break
|
||||
}
|
||||
wantDisk := params.Disks[i]
|
||||
vdisk := vm.vdisks[i]
|
||||
modisk := vdisk.getVirtualDisk()
|
||||
if wantDisk.Size <= int64(vdisk.GetDiskSizeMB()) {
|
||||
continue
|
||||
}
|
||||
originSize := modisk.CapacityInKB
|
||||
modisk.CapacityInKB = wantDisk.Size * 1024
|
||||
spec := &types.VirtualDeviceConfigSpec{}
|
||||
spec.Operation = types.VirtualDeviceConfigSpecOperationEdit
|
||||
spec.Device = vdisk.dev
|
||||
deviceChange = append(deviceChange, spec)
|
||||
log.Infof("resize No.%d data disk: %dGB => %dGB", i, originSize/1024/1024, wantDisk.Size/1024)
|
||||
}
|
||||
// remove extra disk
|
||||
for ; i < len(vm.vdisks); i++ {
|
||||
vdisk := vm.vdisks[i]
|
||||
spec := &types.VirtualDeviceConfigSpec{}
|
||||
spec.Operation = types.VirtualDeviceConfigSpecOperationRemove
|
||||
spec.Device = vdisk.dev
|
||||
spec.FileOperation = types.VirtualDeviceConfigSpecFileOperationDestroy
|
||||
deviceChange = append(deviceChange, spec)
|
||||
log.Infof("remove No.%d data disk", i)
|
||||
}
|
||||
if len(deviceChange) > 0 {
|
||||
spec = types.VirtualMachineConfigSpec{}
|
||||
spec.DeviceChange = deviceChange
|
||||
task, err = vm.getVmObj().Reconfigure(ctx, spec)
|
||||
if err != nil {
|
||||
return vm, errors.Wrap(err, "Reconfigure to resize disks")
|
||||
}
|
||||
err = task.Wait(ctx)
|
||||
if err != nil {
|
||||
return vm, errors.Wrap(err, "Wait task to resize disks")
|
||||
}
|
||||
}
|
||||
}
|
||||
// add data disk
|
||||
for i := 1; i < len(params.Disks); i++ {
|
||||
for ; i < len(params.Disks); i++ {
|
||||
size := params.Disks[i].Size
|
||||
if size == 0 {
|
||||
size = 30 * 1024
|
||||
|
||||
Reference in New Issue
Block a user