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

Reply via email to