Arik Hadas has uploaded a new change for review.

Change subject: core: remove snapshot's memory on remove vm from export domain
......................................................................

core: remove snapshot's memory on remove vm from export domain

When a VM in export domain is being removed, the volumes of the memory
of its snapshots should be removed from the export domain as well.

Change-Id: I0bf0f29aade5cb7c93949a27067d7c4270e86032
Bug-Url: https://bugzilla.redhat.com/960931
Signed-off-by: Arik Hadas <[email protected]>
---
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/RemoveVmFromImportExportCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemoverFromExportDomain.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryUtils.java
5 files changed, 179 insertions(+), 50 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/11/16711/1

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 ce0e59a..b06d4eb 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
@@ -2,7 +2,6 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -15,6 +14,7 @@
 import org.ovirt.engine.core.bll.job.ExecutionContext;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.memory.MemoryImageRemover;
+import org.ovirt.engine.core.bll.memory.MemoryUtils;
 import org.ovirt.engine.core.bll.network.MacPoolManager;
 import org.ovirt.engine.core.bll.network.VmInterfaceManager;
 import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameter;
@@ -102,6 +102,7 @@
     private final List<Guid> diskGuidList = new ArrayList<Guid>();
     private final List<Guid> imageGuidList = new ArrayList<Guid>();
     private final List<String> macsAdded = new ArrayList<String>();
+    private final SnapshotsManager snapshotsManager = new SnapshotsManager();
 
     public ImportVmCommand(ImportVmParameters parameters) {
         super(parameters);
@@ -383,15 +384,6 @@
         return true;
     }
 
-    private Set<String> getMemoryVolumesToBeImported() {
-        Set<String> memories = new HashSet<String>();
-        for (Snapshot snapshot : getVm().getSnapshots()) {
-            memories.add(snapshot.getMemoryVolume());
-        }
-        memories.remove(StringUtils.EMPTY);
-        return memories;
-    }
-
     /**
      * This method fills the given map of domain to the required size for 
storing memory images
      * within it, and also update the memory volume in each snapshot that has 
memory volume with
@@ -425,26 +417,14 @@
             }
             domain2requiredSize.put(storageDomain,
                     domain2requiredSize.get(storageDomain) + 
requiredSizeForMemory);
-            String modifiedMemoryVolume = 
createMemoryVolumeStringWithGivenDomainAndPool(
-                    memoryVolume, storageDomain, 
getParameters().getStoragePoolId());
+            String modifiedMemoryVolume = 
MemoryUtils.changeStorageDomainAndPoolInMemoryVolume(
+                    memoryVolume, storageDomain.getId(), 
getParameters().getStoragePoolId());
             // replace the volume representation with the one with the correct 
domain & pool
             snapshot.setMemoryVolume(modifiedMemoryVolume);
             // save it in case we'll find other snapshots with the same memory 
volume
             handledMemoryVolumes.put(memoryVolume, modifiedMemoryVolume);
         }
         return true;
-    }
-
-    /**
-     * Modified the given memory volume String representation to have the 
given storage
-     * pool and storage domain
-     */
-    private String createMemoryVolumeStringWithGivenDomainAndPool(String 
originalMemoryVolume,
-            StorageDomain storageDomain, Guid storagePoolId) {
-        List<Guid> guids = 
GuidUtils.getGuidListFromString(originalMemoryVolume);
-        return String.format("%1$s,%2$s,%3$s,%4$s,%5$s,%6$s",
-                storageDomain.getId().toString(), storagePoolId.toString(),
-                guids.get(2), guids.get(3), guids.get(4), guids.get(5));
     }
 
     /**
@@ -656,7 +636,7 @@
     }
 
     private void copyAllMemoryImages(Guid containerId) {
-        for (String memoryVolumes : getMemoryVolumesToBeImported()) {
+        for (String memoryVolumes : 
MemoryUtils.getMemoryVolumesFromSnapshots(getVm().getSnapshots())) {
             List<Guid> guids = GuidUtils.getGuidListFromString(memoryVolumes);
 
             // copy the memory dump image
@@ -876,10 +856,8 @@
      * @return The generated snapshot
      */
     protected Snapshot addActiveSnapshot(Guid snapshotId) {
-        return new SnapshotsManager().
-                addActiveSnapshot(snapshotId, getVm(),
-                        getMemoryVolumeForNewActiveSnapshot(),
-                        getCompensationContext());
+        return snapshotsManager.addActiveSnapshot(snapshotId, getVm(),
+                getMemoryVolumeForNewActiveSnapshot(), 
getCompensationContext());
     }
 
     private String getMemoryVolumeForNewActiveSnapshot() {
@@ -1097,8 +1075,8 @@
     }
 
     private void removeVmSnapshots(VM vm) {
-        Collection<String> memoriesOfRemovedSnapshots =
-                new SnapshotsManager().removeSnapshots(vm.getId());
+        Set<String> memoriesOfRemovedSnapshots =
+                snapshotsManager.removeSnapshots(vm.getId());
         new MemoryImageRemover(vm, 
this).removeMemoryVolumes(memoriesOfRemovedSnapshots);
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java
index 95b2f4c..00bb9f1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java
@@ -7,17 +7,23 @@
 import java.util.List;
 import java.util.Map;
 
+import org.ovirt.engine.core.bll.job.ExecutionContext;
+import org.ovirt.engine.core.bll.memory.MemoryImageRemoverFromExportDomain;
+import org.ovirt.engine.core.bll.memory.MemoryUtils;
+import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.RemoveVmFromImportExportParamenters;
 import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
 import org.ovirt.engine.core.common.asynctasks.EntityInfo;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomainType;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
-import org.ovirt.engine.core.common.businessentities.StorageDomain;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import 
org.ovirt.engine.core.common.queries.GetAllFromExportDomainQueryParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
@@ -25,10 +31,11 @@
 import org.ovirt.engine.core.common.vdscommands.RemoveVMVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.NotImplementedException;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 
 @NonTransactiveCommandAttribute
-public class RemoveVmFromImportExportCommand<T extends 
RemoveVmFromImportExportParamenters> extends RemoveVmCommand<T> {
+public class RemoveVmFromImportExportCommand<T extends 
RemoveVmFromImportExportParamenters> extends RemoveVmCommand<T> implements 
TaskHandlerCommand<RemoveVmFromImportExportParamenters>{
 
     // this is needed since overriding getVmTemplate()
     private VM exportVm;
@@ -76,6 +83,7 @@
     protected void executeVmCommand() {
         removeVmInSpm();
         removeDiskImages();
+        removeMemoryImages();
 
         setSucceeded(true);
     }
@@ -100,6 +108,12 @@
                 getParameters().getStoragePoolId(),
                 getVmId(),
                 getParameters().getStorageDomainId());
+    }
+
+    private void removeMemoryImages() {
+         new MemoryImageRemoverFromExportDomain(getVm(), this,
+                 getParameters().getStoragePoolId(), 
getParameters().getStorageDomainId())
+         
.removeMemoryVolumes(MemoryUtils.getMemoryVolumesFromSnapshots(getVm().getSnapshots()));
     }
 
     @Override
@@ -148,4 +162,58 @@
         }
         return jobProperties;
     }
+
+    ///////////////////////////////////////
+    // TaskHandlerCommand Implementation //
+    ///////////////////////////////////////
+
+    public T getParameters() {
+        return super.getParameters();
+    }
+
+    public VdcActionType getActionType() {
+        return super.getActionType();
+    }
+
+    public VdcReturnValueBase getReturnValue() {
+        return super.getReturnValue();
+    }
+
+    public ExecutionContext getExecutionContext() {
+        return super.getExecutionContext();
+    }
+
+    public void setExecutionContext(ExecutionContext executionContext) {
+        super.setExecutionContext(executionContext);
+    }
+
+    public Guid createTask(Guid taskId,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
+            VdcActionType parentCommand,
+            VdcObjectType entityType,
+            Guid... entityIds) {
+        return super.createTaskInCurrentTransaction(taskId, 
asyncTaskCreationInfo, parentCommand, entityType, entityIds);
+    }
+
+    public Guid createTask(Guid taskId,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
+            VdcActionType parentCommand) {
+        return super.createTask(taskId, asyncTaskCreationInfo, parentCommand);
+    }
+
+    public ArrayList<Guid> getTaskIdList() {
+        return super.getTaskIdList();
+    }
+
+    public void preventRollback() {
+        throw new NotImplementedException();
+    }
+
+    public Guid persistAsyncTaskPlaceHolder() {
+        return super.persistAsyncTaskPlaceHolder(getActionType());
+    }
+
+    public Guid persistAsyncTaskPlaceHolder(String taskKey) {
+        return super.persistAsyncTaskPlaceHolder(getActionType(), taskKey);
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java
index a72725a..1c783ab 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java
@@ -1,7 +1,7 @@
 package org.ovirt.engine.core.bll.memory;
 
-import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 
 import org.ovirt.engine.core.bll.AsyncTaskManager;
 import org.ovirt.engine.core.bll.Backend;
@@ -23,6 +23,7 @@
 
     private TaskHandlerCommand<?> enclosingCommand;
     private VM vm;
+    private Boolean cachedPostZero;
 
     public MemoryImageRemover(VM vm, TaskHandlerCommand<?> enclosingCommand) {
         this.enclosingCommand = enclosingCommand;
@@ -35,7 +36,7 @@
         }
     }
 
-    public void removeMemoryVolumes(Collection<String> memoryVolumes) {
+    public void removeMemoryVolumes(Set<String> memoryVolumes) {
         for (String memoryVols : memoryVolumes) {
             removeMemoryVolume(memoryVols);
         }
@@ -58,17 +59,6 @@
         List<Guid> guids = GuidUtils.getGuidListFromString(memVols);
 
         if (guids.size() == 6) {
-            // get all vm disks in order to check post zero - if one of the
-            // disks is marked with wipe_after_delete
-            boolean postZero =
-                    LinqUtils.filter(
-                            getDbFacade().getDiskDao().getAllForVm(vm.getId()),
-                            new Predicate<Disk>() {
-                                @Override
-                                public boolean eval(Disk disk) {
-                                    return disk.isWipeAfterDelete();
-                                }
-                            }).size() > 0;
 
             Guid taskId1 = 
enclosingCommand.persistAsyncTaskPlaceHolder(VmCommand.DELETE_PRIMARY_IMAGE_TASK_KEY);
             // delete first image
@@ -79,8 +69,7 @@
                     .getResourceManager()
                     .RunVdsCommand(
                             VDSCommandType.DeleteImageGroup,
-                            new 
DeleteImageGroupVDSCommandParameters(guids.get(1), guids.get(0),
-                                    guids.get(2), postZero, false));
+                            buildDeleteMemoryImageParams(guids));
 
             if (!vdsRetValue.getSucceeded()) {
                 return false;
@@ -100,8 +89,7 @@
                     .getResourceManager()
                     .RunVdsCommand(
                             VDSCommandType.DeleteImageGroup,
-                            new 
DeleteImageGroupVDSCommandParameters(guids.get(1), guids.get(0),
-                                    guids.get(4), postZero, false));
+                            buildDeleteMemoryConfParams(guids));
 
             if (!vdsRetValue.getSucceeded()) {
                 if (startPollingTasks) {
@@ -123,4 +111,30 @@
         return true;
     }
 
+    protected DeleteImageGroupVDSCommandParameters 
buildDeleteMemoryImageParams(List<Guid> guids) {
+        return new DeleteImageGroupVDSCommandParameters(
+                guids.get(1), guids.get(0), guids.get(2), isPostZero(), false);
+    }
+
+    protected DeleteImageGroupVDSCommandParameters 
buildDeleteMemoryConfParams(List<Guid> guids) {
+        return new DeleteImageGroupVDSCommandParameters(
+                guids.get(1), guids.get(0), guids.get(4), isPostZero(), false);
+    }
+
+    protected boolean isPostZero() {
+        if (cachedPostZero == null) {
+            // get all vm disks in order to check post zero - if one of the
+            // disks is marked with wipe_after_delete
+            cachedPostZero =
+                    LinqUtils.filter(
+                            getDbFacade().getDiskDao().getAllForVm(vm.getId()),
+                            new Predicate<Disk>() {
+                                @Override
+                                public boolean eval(Disk disk) {
+                                    return disk.isWipeAfterDelete();
+                                }
+                            }).size() > 0;
+        }
+        return cachedPostZero;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemoverFromExportDomain.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemoverFromExportDomain.java
new file mode 100644
index 0000000..29eb2ba
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemoverFromExportDomain.java
@@ -0,0 +1,35 @@
+package org.ovirt.engine.core.bll.memory;
+
+import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.compat.Guid;
+
+public class MemoryImageRemoverFromExportDomain extends MemoryImageRemover {
+
+    private Guid storagePoolId;
+    private Guid storageDomainId;
+
+    public MemoryImageRemoverFromExportDomain(VM vm, TaskHandlerCommand<?> 
enclosingCommand,
+            Guid storagePoolId, Guid storageDomainId) {
+        super(vm, enclosingCommand);
+        this.storagePoolId = storagePoolId;
+        this.storageDomainId = storageDomainId;
+    }
+
+    @Override
+    protected boolean isPostZero() {
+        return false;
+    }
+
+    @Override
+    protected boolean shouldRemoveMemorySnapshotVolumes(String memoryVolume) {
+        return !memoryVolume.isEmpty();
+    }
+
+    @Override
+    public void removeMemoryVolume(String memoryVolumes) {
+        super.removeMemoryVolume(
+                MemoryUtils.changeStorageDomainAndPoolInMemoryVolume(
+                        memoryVolumes, storageDomainId, storagePoolId));
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryUtils.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryUtils.java
new file mode 100644
index 0000000..ef14751
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryUtils.java
@@ -0,0 +1,34 @@
+package org.ovirt.engine.core.bll.memory;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.common.businessentities.Snapshot;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.utils.GuidUtils;
+
+public class MemoryUtils {
+
+    /**
+     * Modified the given memory volume String representation to have the 
given storage
+     * pool and storage domain
+     */
+    public static String changeStorageDomainAndPoolInMemoryVolume(
+            String originalMemoryVolume, Guid storageDomainId, Guid 
storagePoolId) {
+        List<Guid> guids = 
GuidUtils.getGuidListFromString(originalMemoryVolume);
+        return String.format("%1$s,%2$s,%3$s,%4$s,%5$s,%6$s",
+                storageDomainId.toString(), storagePoolId.toString(),
+                guids.get(2), guids.get(3), guids.get(4), guids.get(5));
+    }
+
+    public static Set<String> getMemoryVolumesFromSnapshots(List<Snapshot> 
snapshots) {
+        Set<String> memories = new HashSet<String>();
+        for (Snapshot snapshot : snapshots) {
+            memories.add(snapshot.getMemoryVolume());
+        }
+        memories.remove(StringUtils.EMPTY);
+        return memories;
+    }
+}


-- 
To view, visit http://gerrit.ovirt.org/16711
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0bf0f29aade5cb7c93949a27067d7c4270e86032
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Arik Hadas <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to