Arik Hadas has uploaded a new change for review. Change subject: core: [WIP] handling memory snapshots on export/import vm ......................................................................
core: [WIP] handling memory snapshots on export/import vm Export the memory volumes to the export domain when exporting VM that has snapshots that contain memory, and importing the memory volumes when importing VM that has snapshots that contain memory. Change-Id: I7786b8b51808e738c4d3d2396f31f06e9614264a Signed-off-by: Arik Hadas <aha...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java 8 files changed, 210 insertions(+), 78 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/20/15120/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java index 92f09dd..b5ae611 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -9,6 +10,7 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; import org.ovirt.engine.core.bll.utils.ClusterUtils; @@ -34,6 +36,7 @@ import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VolumeFormat; +import org.ovirt.engine.core.common.businessentities.VolumeType; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.locks.LockingGroup; @@ -62,6 +65,7 @@ public class ExportVmCommand<T extends MoveVmParameters> extends MoveOrCopyTemplateCommand<T> { private List<DiskImage> disksImages; + private Collection<Snapshot> snapshotsWithMemory; /** * Constructor for command creation when compensation is applied on startup @@ -136,8 +140,7 @@ if (getParameters().getCopyCollapse()) { for (DiskImage img : getDisksBasedOnImage()) { if (images.containsKey(img.getId())) { - // check that no RAW format exists (we are in collapse - // mode) + // check that no RAW format exists (we are in collapse mode) if (((DiskImage) images.get(img.getId())).getVolumeFormat() == VolumeFormat.RAW && img.getVolumeFormat() != VolumeFormat.RAW) { addCanDoActionMessage(VdcBllMessages.VM_CANNOT_EXPORT_RAW_FORMAT); @@ -152,8 +155,12 @@ addCanDoActionMessage(String.format("$storageDomainName %1$s", getStorageDomainName())); return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_SPECIFY_DOMAIN_IS_NOT_EXPORT_DOMAIN); } + + // get the snapshot that are going to be exported and have memory + snapshotsWithMemory = getSnapshotsToBeExportedWithMemory(); + // check destination storage have free space - int sizeInGB = (int) getVm().getActualDiskWithSnapshotsSize(); + int sizeInGB = (int) getVm().getActualDiskWithSnapshotsSize() + getTotalMemoryStatesSizeGb(); if (!doesStorageDomainhaveSpaceForRequest(getStorageDomain(), sizeInGB)) { return false; } @@ -170,6 +177,41 @@ } return true; + } + + private Collection<Snapshot> getSnapshotsToBeExportedWithMemory() { + if (getParameters().getCopyCollapse()) { + Snapshot activeSnapshot = getSnapshotDao().get(getVmId(), SnapshotType.ACTIVE); + return !activeSnapshot.getMemoryVolume().isEmpty() ? + Collections.<Snapshot>singleton(activeSnapshot) : Collections.<Snapshot>emptyList(); + } + else { + Map<String, Snapshot> memory2snapshot = new HashMap<String, Snapshot>(); + for (Snapshot snapshot : getSnapshotDao().getAll(getVmId())) { + memory2snapshot.put(snapshot.getMemoryVolume(), snapshot); + } + memory2snapshot.remove(StringUtils.EMPTY); + return memory2snapshot.values(); + } + } + + private int getTotalMemoryStatesSizeGb() { + int sizeInMb = 0; + SnapshotsManager snapshotsManager = new SnapshotsManager(); + for (Snapshot snapshot : snapshotsWithMemory) { + String vmConfiguration = snapshot.getVmConfiguration(); + if (vmConfiguration == null) { + // the active snapshot doesn't hold vm configuration + continue; + } + VM vm = new VM(); + boolean succeed = snapshotsManager.updateVmFromConfiguration(vm, snapshot.getVmConfiguration()); + if (!succeed) { + // TODO + } + sizeInMb += vm.getTotalMemorySizeMb() + HibernateVmCommand.getMetaDataSizeInBytes() * 1024; + } + return (int) Math.ceil(sizeInMb / 1024.0); } @Override @@ -189,7 +231,6 @@ endSuccessfullySynchronous(); } else { TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { - @Override public Void runInTransaction() { @@ -266,7 +307,10 @@ @Override protected void moveOrCopyAllImageGroups() { + // Disks moveOrCopyAllImageGroups(getVm().getId(), getDisksBasedOnImage()); + // Memory volumes + copyAllMemoryImages(getVm().getId()); } private List<DiskImage> getDisksBasedOnImage() { @@ -276,25 +320,72 @@ return disksImages; } + protected void copyAllMemoryImages(Guid containerID) { + for (Snapshot snapshot : snapshotsWithMemory) { + Guid[] guids = VmCommand.parseMemoryVolumesString(snapshot.getMemoryVolume()); + + // copy the memory dump image + VdcReturnValueBase vdcRetValue = Backend.getInstance().runInternalAction( + VdcActionType.MoveOrCopyImageGroup, + buildMoveOrCopyImageGroupParametersForMemoryDumpImage( + containerID, guids[0], guids[2], guids[3]), + ExecutionHandler.createDefaultContexForTasks(getExecutionContext())); + if (!vdcRetValue.getSucceeded()) { + throw new VdcBLLException(vdcRetValue.getFault().getError(), "Failed during ExportVmCommand"); + } + getReturnValue().getTaskIdList().addAll(vdcRetValue.getInternalTaskIdList()); + + // copy the memory configuration (of the VM) image + vdcRetValue = Backend.getInstance().runInternalAction( + VdcActionType.MoveOrCopyImageGroup, + buildMoveOrCopyImageGroupParametersForMemoryConfImage( + containerID, guids[0], guids[4], guids[5]), + ExecutionHandler.createDefaultContexForTasks(getExecutionContext())); + if (!vdcRetValue.getSucceeded()) { + throw new VdcBLLException(vdcRetValue.getFault().getError(), "Failed during ExportVmCommand"); + } + getReturnValue().getTaskIdList().addAll(vdcRetValue.getInternalTaskIdList()); + } + } + + private MoveOrCopyImageGroupParameters buildMoveOrCopyImageGroupParametersForMemoryDumpImage( + Guid containerID, Guid storageDomainId, Guid imageId, Guid volumeId) { + MoveOrCopyImageGroupParameters params = new MoveOrCopyImageGroupParameters(containerID, imageId, + volumeId, getParameters().getStorageDomainId(), getMoveOrCopyImageOperation()); + params.setParentCommand(getActionType()); + params.setEntityId(getParameters().getEntityId()); + params.setUseCopyCollapse(getParameters().getCopyCollapse()); + params.setVolumeFormat(VolumeFormat.RAW); + params.setVolumeType(VolumeType.Preallocated); + params.setCopyVolumeType(CopyVolumeType.LeafVol); + params.setForceOverride(getParameters().getForceOverride()); + params.setParentParameters(getParameters()); + params.setSourceDomainId(storageDomainId); + return params; + } + + private MoveOrCopyImageGroupParameters buildMoveOrCopyImageGroupParametersForMemoryConfImage( + Guid containerID, Guid storageDomainId, Guid imageId, Guid volumeId) { + MoveOrCopyImageGroupParameters params = new MoveOrCopyImageGroupParameters(containerID, imageId, + volumeId, getParameters().getStorageDomainId(), getMoveOrCopyImageOperation()); + params.setParentCommand(getActionType()); + params.setEntityId(getParameters().getEntityId()); + params.setUseCopyCollapse(getParameters().getCopyCollapse()); + params.setVolumeFormat(VolumeFormat.COW); + params.setVolumeType(VolumeType.Sparse); + params.setCopyVolumeType(CopyVolumeType.LeafVol); + params.setForceOverride(getParameters().getForceOverride()); + params.setParentParameters(getParameters()); + params.setSourceDomainId(storageDomainId); + return params; + } + @Override protected void moveOrCopyAllImageGroups(Guid containerID, Iterable<DiskImage> disks) { for (DiskImage disk : disks) { - MoveOrCopyImageGroupParameters tempVar = new MoveOrCopyImageGroupParameters(containerID, disk - .getId(), disk.getImageId(), getParameters().getStorageDomainId(), - getMoveOrCopyImageOperation()); - tempVar.setParentCommand(getActionType()); - tempVar.setEntityId(getParameters().getEntityId()); - tempVar.setUseCopyCollapse(getParameters().getCopyCollapse()); - DiskImage diskForVolumeInfo = getDiskForVolumeInfo(disk); - tempVar.setVolumeFormat(diskForVolumeInfo.getVolumeFormat()); - tempVar.setVolumeType(diskForVolumeInfo.getVolumeType()); - tempVar.setCopyVolumeType(CopyVolumeType.LeafVol); - tempVar.setForceOverride(getParameters().getForceOverride()); - MoveOrCopyImageGroupParameters p = tempVar; - p.setParentParameters(getParameters()); VdcReturnValueBase vdcRetValue = Backend.getInstance().runInternalAction( VdcActionType.MoveOrCopyImageGroup, - p, + buildMoveOrCopyImageGroupParametersForDisk(containerID, disk), ExecutionHandler.createDefaultContexForTasks(getExecutionContext())); if (!vdcRetValue.getSucceeded()) { throw new VdcBLLException(vdcRetValue.getFault().getError(), "Failed during ExportVmCommand"); @@ -302,6 +393,21 @@ getReturnValue().getTaskIdList().addAll(vdcRetValue.getInternalTaskIdList()); } + } + + private MoveOrCopyImageGroupParameters buildMoveOrCopyImageGroupParametersForDisk(Guid containerID, DiskImage disk) { + MoveOrCopyImageGroupParameters params = new MoveOrCopyImageGroupParameters(containerID, disk.getId(), + disk.getImageId(), getParameters().getStorageDomainId(), getMoveOrCopyImageOperation()); + params.setParentCommand(getActionType()); + params.setEntityId(getParameters().getEntityId()); + params.setUseCopyCollapse(getParameters().getCopyCollapse()); + DiskImage diskForVolumeInfo = getDiskForVolumeInfo(disk); + params.setVolumeFormat(diskForVolumeInfo.getVolumeFormat()); + params.setVolumeType(diskForVolumeInfo.getVolumeType()); + params.setCopyVolumeType(CopyVolumeType.LeafVol); + params.setForceOverride(getParameters().getForceOverride()); + params.setParentParameters(getParameters()); + return params; } /** @@ -432,7 +538,7 @@ vm.setVmtName(null); Snapshot activeSnapshot = DbFacade.getInstance().getSnapshotDao().get( DbFacade.getInstance().getSnapshotDao().getId(vm.getId(), SnapshotType.ACTIVE)); - vm.setSnapshots(Arrays.asList(activeSnapshot)); + vm.setSnapshots(Collections.singletonList(activeSnapshot)); updateCopyVmInSpm(getVm().getStoragePoolId(), vm, getParameters() .getStorageDomainId()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java index 7b09d0d..658783e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java @@ -12,6 +12,7 @@ import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType; import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VolumeFormat; import org.ovirt.engine.core.common.businessentities.VolumeType; @@ -359,15 +360,19 @@ } } + private VolumeType getVolumeType() { + return getMemoryDumpVolumeType(getStoragePool()); + } + /** * Returns whether to use Sparse or Preallocation. If the storage type is file system devices ,it would be more * efficient to use Sparse allocation. Otherwise for block devices we should use Preallocated for faster allocation. * * @return - VolumeType of allocation type to use. */ - private VolumeType getVolumeType() { - return (getStoragePool().getstorage_pool_type().isFileDomain()) ? VolumeType.Sparse - : VolumeType.Preallocated; + static VolumeType getMemoryDumpVolumeType(StoragePool storagePool) { + return storagePool.getstorage_pool_type().isFileDomain() ? + VolumeType.Sparse : VolumeType.Preallocated; } /** diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java index b65873c..b19275b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java @@ -418,16 +418,19 @@ public static boolean CheckImageConfiguration(StorageDomainStatic storageDomain, DiskImageBase diskInfo, List<String> messages) { - boolean result = true; - if ((diskInfo.getVolumeType() == VolumeType.Preallocated && diskInfo.getVolumeFormat() == VolumeFormat.COW) - || (storageDomain.getStorageType().isBlockDomain() && diskInfo.getVolumeType() == VolumeType.Sparse && diskInfo.getVolumeFormat() == VolumeFormat.RAW) - || diskInfo.getVolumeFormat() == VolumeFormat.Unassigned - || diskInfo.getVolumeType() == VolumeType.Unassigned) { + if (!checkImageConfiguration(storageDomain, diskInfo.getVolumeType(), diskInfo.getVolumeFormat())) { // not supported - result = false; messages.add(VdcBllMessages.ACTION_TYPE_FAILED_DISK_CONFIGURATION_NOT_SUPPORTED.toString()); + return false; } - return result; + return true; + } + + public static boolean checkImageConfiguration(StorageDomainStatic storageDomain, VolumeType volumeType, VolumeFormat volumeFormat) { + return !((volumeType == VolumeType.Preallocated && volumeFormat == VolumeFormat.COW) + || (storageDomain.getStorageType().isBlockDomain() && volumeType == VolumeType.Sparse && volumeFormat == VolumeFormat.RAW) + || volumeFormat == VolumeFormat.Unassigned + || volumeType == VolumeType.Unassigned); } public static boolean CheckImagesConfiguration(Guid storageDomainId, diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java index 7c17fff..857de0e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java @@ -128,6 +128,7 @@ } return super.getVmId(); } + @Override public VM getVm() { if (getParameters().isImportAsNewEntity()) { @@ -566,6 +567,7 @@ addVmImagesAndSnapshots(); updateSnapshotsFromExport(); moveOrCopyAllImageGroups(); + copyAllMemoryImages(); VmDeviceUtils.addImportedDevices(getVm().getStaticData(), getParameters().isImportAsNewEntity()); VmHandler.LockVm(getVm().getId()); if (getParameters().isImportAsNewEntity()) { @@ -584,37 +586,17 @@ ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), false, false)); } + private void copyAllMemoryImages() { + + } + @Override protected void moveOrCopyAllImageGroups(Guid containerID, Iterable<DiskImage> disks) { int i = 0; for (DiskImage disk : disks) { - Guid destinationDomain = imageToDestinationDomainMap.get(diskGuidList.get(i)); - MoveOrCopyImageGroupParameters p = new MoveOrCopyImageGroupParameters(containerID, - diskGuidList.get(i), - imageGuidList.get(i), - disk.getId(), - disk.getImageId(), - destinationDomain, getMoveOrCopyImageOperation()); - p.setParentCommand(getActionType()); - p.setUseCopyCollapse(getParameters().getCopyCollapse()); - p.setCopyVolumeType(CopyVolumeType.LeafVol); - p.setForceOverride(getParameters().getForceOverride()); - p.setSourceDomainId(getParameters().getSourceDomainId()); - p.setStoragePoolId(getParameters().getStoragePoolId()); - p.setImportEntity(true); - p.setEntityId(getVm().getId()); - p.setQuotaId(disk.getQuotaId() != null ? disk.getQuotaId() : getParameters().getQuotaId()); - if (getParameters().getVm().getDiskMap() != null - && getParameters().getVm().getDiskMap().containsKey(diskGuidList.get(i))) { - DiskImageBase diskImageBase = - (DiskImageBase) getParameters().getVm().getDiskMap().get(diskGuidList.get(i)); - p.setVolumeType(diskImageBase.getVolumeType()); - p.setVolumeFormat(diskImageBase.getVolumeFormat()); - } - p.setParentParameters(getParameters()); VdcReturnValueBase vdcRetValue = Backend.getInstance().runInternalAction( VdcActionType.MoveOrCopyImageGroup, - p, + buildMoveOrCopyImageGroupParametersForDisk(disk, containerID, i++), ExecutionHandler.createDefaultContexForTasks(getExecutionContext())); if (!vdcRetValue.getSucceeded()) { throw new VdcBLLException(vdcRetValue.getFault().getError(), @@ -622,10 +604,37 @@ } getReturnValue().getTaskIdList().addAll(vdcRetValue.getInternalTaskIdList()); - i++; } } + private MoveOrCopyImageGroupParameters buildMoveOrCopyImageGroupParametersForDisk(DiskImage disk, Guid containerID, int i) { + Guid destinationDomain = imageToDestinationDomainMap.get(diskGuidList.get(i)); + MoveOrCopyImageGroupParameters params = new MoveOrCopyImageGroupParameters(containerID, + diskGuidList.get(i), + imageGuidList.get(i), + disk.getId(), + disk.getImageId(), + destinationDomain, getMoveOrCopyImageOperation()); + params.setParentCommand(getActionType()); + params.setUseCopyCollapse(getParameters().getCopyCollapse()); + params.setCopyVolumeType(CopyVolumeType.LeafVol); + params.setForceOverride(getParameters().getForceOverride()); + params.setSourceDomainId(getParameters().getSourceDomainId()); + params.setStoragePoolId(getParameters().getStoragePoolId()); + params.setImportEntity(true); + params.setEntityId(getVm().getId()); + params.setQuotaId(disk.getQuotaId() != null ? disk.getQuotaId() : getParameters().getQuotaId()); + if (getParameters().getVm().getDiskMap() != null + && getParameters().getVm().getDiskMap().containsKey(diskGuidList.get(i))) { + DiskImageBase diskImageBase = + (DiskImageBase) getParameters().getVm().getDiskMap().get(diskGuidList.get(i)); + params.setVolumeType(diskImageBase.getVolumeType()); + params.setVolumeFormat(diskImageBase.getVolumeFormat()); + } + params.setParentParameters(getParameters()); + return params; + } + protected void addVmImagesAndSnapshots() { Map<Guid, List<DiskImage>> images = getImagesLeaf(getVm().getImages()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java index eb22c27..ca33504 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java @@ -55,48 +55,42 @@ lockImage(); VDSReturnValue vdsReturnValue = null; - Guid sourceDomainId = getParameters().getSourceDomainId() != null ? getParameters().getSourceDomainId() - .getValue() + Guid sourceDomainId = getParameters().getSourceDomainId() != null ? + getParameters().getSourceDomainId().getValue() : getDiskImage().getStorageIds().get(0); if (getParameters().getUseCopyCollapse()) { vdsReturnValue = runVdsCommand( VDSCommandType.CopyImage, - new CopyImageVDSCommandParameters(getStorageDomain().getStoragePoolId() - .getValue(), + new CopyImageVDSCommandParameters( + getStorageDomain().getStoragePoolId().getValue(), sourceDomainId, - getParameters() - .getContainerId(), + getParameters().getContainerId(), getParameters().getImageGroupID(), - getParameters() - .getImageId(), + getParameters().getImageId(), getParameters().getDestImageGroupId(), getParameters().getDestinationImageId(), "", getParameters().getStorageDomainId(), - getParameters() - .getCopyVolumeType(), + getParameters().getCopyVolumeType(), getParameters().getVolumeFormat(), - getParameters() - .getVolumeType(), + getParameters().getVolumeType(), isWipeAfterDelete(), - getParameters() - .getForceOverride(), + getParameters().getForceOverride(), getStoragePool().getcompatibility_version().toString())); } else { vdsReturnValue = runVdsCommand( VDSCommandType.MoveImageGroup, - new MoveImageGroupVDSCommandParameters(getDiskImage().getStoragePoolId() - .getValue(), + new MoveImageGroupVDSCommandParameters( + getDiskImage() != null ? getDiskImage().getStoragePoolId() + .getValue() : getStorageDomain().getStoragePoolId().getValue(), sourceDomainId, - getDiskImage() - .getId(), + getDiskImage() != null ? getDiskImage().getId() : getParameters().getImageGroupID(), getParameters().getStorageDomainId(), getParameters().getContainerId(), getParameters().getOperation(), isWipeAfterDelete(), getParameters().getForceOverride(), - getStoragePool() - .getcompatibility_version().toString())); + getStoragePool().getcompatibility_version().toString())); } if (vdsReturnValue.getSucceeded()) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java index 29f411a..aec8e49 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java @@ -231,13 +231,22 @@ return VdcActionType.Unknown; } - protected boolean removeMemoryVolumes(String memVols, VdcActionType parentCommand, boolean startPollingTasks) { - // this is temp code until it will be implemented in SPM + /** + * Utility method that split the element in the String representation of + * the memory volume string to array of guids + */ + static Guid[] parseMemoryVolumesString(String memVols) { String[] strings = memVols.split(","); Guid[] guids = new Guid[strings.length]; for (int i=0; i<strings.length; ++i) { guids[i] = new Guid(strings[i]); } + return guids; + } + + protected boolean removeMemoryVolumes(String memVols, VdcActionType parentCommand, boolean startPollingTasks) { + // this is temp code until it will be implemented in SPM + Guid[] guids = parseMemoryVolumesString(memVols); if (guids.length == 6) { // get all vm disks in order to check post zero - if one of the diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java index 99fedef..649d94f 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java @@ -1407,7 +1407,12 @@ */ @JsonIgnore public long getTotalMemorySizeInBytes() { - return (long) (getVmMemSizeMb() + 200 + (64 * getNumOfMonitors())) * 1024 * 1024; + return getTotalMemorySizeMb() * 1024 * 1024; + } + + @JsonIgnore + public long getTotalMemorySizeMb() { + return getVmMemSizeMb() + 200 + (64 * getNumOfMonitors()); } /////////////////////////////////////////////// diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java index 54caed0..7ad1cd0 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java @@ -325,6 +325,7 @@ _writer.writeElement("Type", snapshot.getType().name()); _writer.writeElement("Description", snapshot.getDescription()); _writer.writeElement("CreationDate", OvfParser.LocalDateToUtcDateString(snapshot.getCreationDate())); + _writer.writeElement("Memory", snapshot.getMemoryVolume()); if (snapshot.getAppList() != null) { _writer.writeElement("ApplicationList", snapshot.getAppList()); } -- To view, visit http://gerrit.ovirt.org/15120 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7786b8b51808e738c4d3d2396f31f06e9614264a Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Arik Hadas <aha...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches