Ravi Nori has uploaded a new change for review.

Change subject: core : Persist AsyncTask before submitting to vdsm
......................................................................

core : Persist AsyncTask before submitting to vdsm

This is second patch for better support for cases of
missing engine crash

This patch persists the AsyncTask before submitting
and then updates the async task with the id from vdsm.

Change-Id: Ibc5a548cb53172e6399f4334f24163dd855291ab
Signed-off-by: Ravi Nori <rn...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.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/MoveOrCopyImageGroupCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java
22 files changed, 265 insertions(+), 62 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/78/14078/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
index 1ea8307..c9702d2 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
@@ -36,7 +36,11 @@
         if (getEnclosingCommand().getParameters().getTaskGroupSuccess()) {
             getReturnValue().setSucceeded(false);
             beforeTask();
-            addTask(Backend.getInstance().getResourceManager()
+            Guid taskId = cmd.createAsyncTask(cmd.getActionType(),
+                    getTaskObjectType(),
+                    getTaskObjects());
+
+            addTask(taskId, Backend.getInstance().getResourceManager()
                     .RunVdsCommand(getVDSCommandType(), getVDSParameters()), 
false);
         }
         
ExecutionHandler.setAsyncJob(getEnclosingCommand().getExecutionContext(), true);
@@ -48,23 +52,28 @@
         revertTask();
         VDSCommandType revertCommandType = getRevertVDSCommandType();
         if (revertCommandType != null) {
-            addTask(Backend.getInstance().getResourceManager()
+            Guid taskId = cmd.createAsyncTask(cmd.getActionType(),
+                getTaskObjectType(),
+                getTaskObjects());
+
+            addTask(taskId, Backend.getInstance().getResourceManager()
                     .RunVdsCommand(getRevertVDSCommandType(), 
getRevertVDSParameters()), true);
         }
     }
 
-    private void addTask(VDSReturnValue vdsReturnValue, boolean 
isRevertedTask) {
+    private void addTask(Guid taskId, VDSReturnValue vdsReturnValue, boolean 
isRevertedTask) {
         AsyncTaskCreationInfo taskCreationInfo = 
vdsReturnValue.getCreationInfo();
         getReturnValue().getInternalTaskIdList().add(cmd.createTask(
+                taskId,
                 taskCreationInfo,
                 cmd.getActionType(),
                 getTaskObjectType(),
                 getTaskObjects())
                 );
-        Guid taskId = taskCreationInfo.getVdsmTaskId();
-        getReturnValue().getTaskIdList().add(taskId);
+        Guid vdsmTaskId = taskCreationInfo.getVdsmTaskId();
+        getReturnValue().getTaskIdList().add(vdsmTaskId);
         if (isRevertedTask) {
-            log.infoFormat("Reverting task {0} with ID {1} on DataCenter 
{2}.", taskCreationInfo.getTaskType().name(), taskId, 
taskCreationInfo.getStoragePoolID());
+            log.infoFormat("Reverting task {0} with ID {1} on DataCenter 
{2}.", taskCreationInfo.getTaskType().name(), vdsmTaskId, 
taskCreationInfo.getStoragePoolID());
         }
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
index 62bc58d..ea01f49 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
@@ -71,6 +71,10 @@
     }
 
     protected boolean processImageInIrs() {
+        Guid taskId = this.createAsyncTask(getParameters().getParentCommand(),
+                        VdcObjectType.Storage,
+                        getParameters().getStorageDomainId());
+
         VDSReturnValue vdsReturnValue = runVdsCommand(
                         VDSCommandType.CreateImage,
                         new 
CreateImageVDSCommandParameters(getParameters().getStoragePoolId(), 
getParameters()
@@ -81,7 +85,8 @@
         if (vdsReturnValue.getSucceeded()) {
             getParameters().setTaskIds(new ArrayList<Guid>());
             getParameters().getTaskIds().add(
-                    createTask(vdsReturnValue.getCreationInfo(),
+                    createTask(taskId,
+                            vdsReturnValue.getCreationInfo(),
                             getParameters().getParentCommand(),
                             VdcObjectType.Storage,
                             getParameters().getStorageDomainId()));
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
index 252e87f..351a90f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
@@ -1247,6 +1247,18 @@
         _returnValue.setFault(fault);
     }
 
+    public Guid createAsyncTask(
+            VdcActionType parentCommand) {
+        return TaskManagerUtil.createAsyncTask(this, parentCommand, null, 
EMPTY_GUID_ARRAY);
+    }
+
+    public Guid createAsyncTask(
+            VdcActionType parentCommand,
+            VdcObjectType entityType,
+            Guid... entityIds) {
+        return TaskManagerUtil.createAsyncTask(this, parentCommand, 
entityType, entityIds);
+    }
+
     /**
      * Use this method in order to create task in the AsyncTaskManager in a 
safe way. If you use this method within a
      * certain command, make sure that the command implemented the 
ConcreteCreateTask method.
@@ -1261,11 +1273,13 @@
      *            Ids of entities to be associated with task
      * @return Guid of the created task.
      */
-    protected Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo,
+    protected Guid createTask(
+            Guid taskId,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand,
             VdcObjectType entityType,
             Guid... entityIds) {
-        return TaskManagerUtil.createTask(this, asyncTaskCreationInfo, 
parentCommand, null, entityType, entityIds);
+        return TaskManagerUtil.createTask(taskId, this, asyncTaskCreationInfo, 
parentCommand, null, entityType, entityIds);
     }
 
     /**
@@ -1275,8 +1289,8 @@
      * @return An {@link SPMAsyncTask} object representing the task to be run
      */
     public SPMTask concreteCreateTask
-            (AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType 
parentCommand) {
-        return TaskManagerUtil.concreteCreateTask(this, asyncTaskCreationInfo, 
parentCommand);
+            (Guid taskId, AsyncTaskCreationInfo asyncTaskCreationInfo, 
VdcActionType parentCommand) {
+        return TaskManagerUtil.concreteCreateTask(taskId, this, 
asyncTaskCreationInfo, parentCommand);
     }
     /**
      * Use this method in order to create task in the AsyncTaskManager in a 
safe way. If you use this method within a
@@ -1292,9 +1306,9 @@
      *            Ids of entities to be associated with task
      * @return Guid of the created task.
      */
-    protected Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo,
+    protected Guid createTask(Guid taskId, AsyncTaskCreationInfo 
asyncTaskCreationInfo,
             VdcActionType parentCommand) {
-        return TaskManagerUtil.createTask(this, asyncTaskCreationInfo, 
parentCommand, null, null, EMPTY_GUID_ARRAY);
+        return TaskManagerUtil.createTask(taskId, this, asyncTaskCreationInfo, 
parentCommand, null, null, EMPTY_GUID_ARRAY);
     }
 
     /** @return The type of task that should be created for this command. 
Commands that do not create async tasks should throw a {@link 
UnsupportedOperationException} */
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
index a8fc05f..d7d5a68 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
@@ -59,6 +59,11 @@
 
         VDSReturnValue vdsReturnValue = null;
         try {
+            Guid taskId = this.createAsyncTask(VdcActionType.AddVmFromTemplate,
+                                VdcObjectType.Storage,
+                                getParameters().getStorageDomainId(),
+                                getDestinationStorageDomainId());
+
             vdsReturnValue = Backend
                     .getInstance()
                     .getResourceManager()
@@ -74,7 +79,10 @@
 
             if (vdsReturnValue.getSucceeded()) {
                 getReturnValue().getInternalTaskIdList().add(
-                        createTask(vdsReturnValue.getCreationInfo(), 
VdcActionType.AddVmFromTemplate,VdcObjectType.Storage,
+                        createTask(taskId,
+                                vdsReturnValue.getCreationInfo(),
+                                VdcActionType.AddVmFromTemplate,
+                                VdcObjectType.Storage,
                                 getParameters().getStorageDomainId(),
                                 getDestinationStorageDomainId()));
             }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
index 33958e0..e3292ad 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
@@ -48,6 +48,11 @@
         DiskImage newImage = cloneDiskImage(getDestinationImageId());
         fillVolumeInformation(newImage);
 
+        Guid taskId = this.createAsyncTask(VdcActionType.AddVmTemplate,
+                        VdcObjectType.Storage,
+                        getParameters().getStorageDomainId(),
+                        getParameters().getDestinationStorageDomainId());
+
         VDSReturnValue vdsReturnValue = Backend
                 .getInstance()
                 .getResourceManager()
@@ -62,8 +67,11 @@
                                         .toString()));
 
         getReturnValue().getInternalTaskIdList().add(
-                createTask(vdsReturnValue.getCreationInfo(), 
VdcActionType.AddVmTemplate,
-                        VdcObjectType.Storage, 
getParameters().getStorageDomainId(),
+                createTask(taskId,
+                        vdsReturnValue.getCreationInfo(),
+                        VdcActionType.AddVmTemplate,
+                        VdcObjectType.Storage,
+                        getParameters().getStorageDomainId(),
                         getParameters().getDestinationStorageDomainId()));
 
         newImage.setId(destinationImageGroupID);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
index 8e408b8..eded9e6 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
@@ -82,6 +82,11 @@
         VDSReturnValue vdsReturnValue = null;
 
         try {
+            Guid taskId = 
this.createAsyncTask(getParameters().getParentCommand(),
+                                VdcObjectType.Storage,
+                                getParameters().getStorageDomainId(),
+                                getParameters().getDestinationImageId());
+
            vdsReturnValue =
                     Backend
                             .getInstance()
@@ -103,7 +108,8 @@
             if (vdsReturnValue.getSucceeded()) {
                 getParameters().setTaskIds(new java.util.ArrayList<Guid>());
                 getParameters().getTaskIds().add(
-                        createTask(vdsReturnValue.getCreationInfo(),
+                        createTask(taskId,
+                                vdsReturnValue.getCreationInfo(),
                                 getParameters().getParentCommand(),
                                 VdcObjectType.Storage,
                                 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 23916ff..1e1860b 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
@@ -112,6 +112,10 @@
                         }
                     });
 
+            Guid taskId1 = this.createAsyncTask(VdcActionType.HibernateVm,
+                            VdcObjectType.Storage,
+                            getStorageDomainId().getValue());
+
             Guid image1GroupId = Guid.NewGuid();
             // this is temp code until SPM will implement the new verb that 
does
             // it for us:
@@ -138,11 +142,14 @@
                 return;
             }
             Guid guid1 =
-                    createTask(ret1.getCreationInfo(),
+                    createTask(taskId1,
+                            ret1.getCreationInfo(),
                             VdcActionType.HibernateVm,
                             VdcObjectType.Storage,
                             getStorageDomainId().getValue());
             getReturnValue().getTaskIdList().add(guid1);
+
+            Guid taskId2 = this.createAsyncTask(VdcActionType.HibernateVm);
 
             // second vol should be 10kb
             Guid image2GroupId = Guid.NewGuid();
@@ -169,7 +176,7 @@
             if (!ret2.getSucceeded()) {
                 return;
             }
-            Guid guid2 = createTask(ret2.getCreationInfo(), 
VdcActionType.HibernateVm);
+            Guid guid2 = createTask(taskId2, ret2.getCreationInfo(), 
VdcActionType.HibernateVm);
             getReturnValue().getTaskIdList().add(guid2);
 
             // this is the new param that should be passed to the hibernate
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 89c239c..f056f68 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
@@ -59,6 +59,12 @@
         Guid sourceDomainId = getParameters().getSourceDomainId() != null ? 
getParameters().getSourceDomainId()
                 .getValue()
                 : getDiskImage().getStorageIds().get(0);
+
+        Guid taskId = this.createAsyncTask(getParameters().getParentCommand(),
+                            VdcObjectType.Storage,
+                            sourceDomainId,
+                            getParameters().getStorageDomainId());
+
         if (getParameters().getUseCopyCollapse()) {
             vdsReturnValue = runVdsCommand(
                     VDSCommandType.CopyImage,
@@ -103,7 +109,8 @@
         if (vdsReturnValue.getSucceeded()) {
             AsyncTaskCreationInfo taskCreationInfo = 
vdsReturnValue.getCreationInfo();
             getReturnValue().getInternalTaskIdList().add(
-                    createTask(taskCreationInfo,
+                    createTask(taskId,
+                            taskCreationInfo,
                             getParameters().getParentCommand(),
                             VdcObjectType.Storage,
                             sourceDomainId,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
index f16f844..11d9786 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
@@ -76,9 +76,14 @@
     @Override
     protected void executeCommand() {
         if (getDiskImage() != null) {
+            Guid taskId = 
this.createAsyncTask(getParameters().getParentCommand(),
+                            VdcObjectType.Storage,
+                            getParameters().getStorageDomainId());
+
             VDSReturnValue vdsReturnValue = performImageVdsmOperation();
             getReturnValue().getInternalTaskIdList().add(
-                    createTask(vdsReturnValue.getCreationInfo(),
+                    createTask(taskId,
+                            vdsReturnValue.getCreationInfo(),
                             getParameters().getParentCommand(),
                             VdcObjectType.Storage,
                             getParameters().getStorageDomainId()));
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
index d1f81a2..c71d53a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
@@ -34,6 +34,10 @@
         Guid imageGroupId = getDiskImage().getimage_group_id() != null ? 
getDiskImage().getimage_group_id().getValue()
                 : Guid.Empty;
 
+        Guid taskId = this.createAsyncTask(VdcActionType.RemoveSnapshot,
+                            VdcObjectType.Storage,
+                            storageDomainId);
+
         VDSReturnValue vdsReturnValue = Backend
                 .getInstance()
                 .getResourceManager()
@@ -46,7 +50,8 @@
 
         if (vdsReturnValue != null && vdsReturnValue.getCreationInfo() != 
null) {
             getReturnValue().getInternalTaskIdList().add(
-                    TaskManagerUtil.createTask(this,
+                    TaskManagerUtil.createTask(taskId,
+                            this,
                             vdsReturnValue.getCreationInfo(),
                             VdcActionType.RemoveSnapshot,
                             
ExecutionMessageDirector.resolveStepMessage(StepEnum.MERGE_SNAPSHOTS, 
getJobMessageProperties()),
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
index 7651dcb..dd12467 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
@@ -7,6 +7,7 @@
 import 
org.ovirt.engine.core.common.vdscommands.DeleteImageGroupVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import org.ovirt.engine.core.compat.Guid;
 
 /**
  * This command is responsible for removing a template image.
@@ -19,6 +20,10 @@
 
     @Override
     protected void executeCommand() {
+        Guid taskId = this.createAsyncTask(VdcActionType.RemoveVmTemplate,
+                            VdcObjectType.Storage,
+                            getParameters().getStorageDomainId());
+
         VDSReturnValue vdsReturnValue = Backend
                 .getInstance()
                 .getResourceManager()
@@ -30,7 +35,8 @@
 
         if (vdsReturnValue.getSucceeded()) {
             getReturnValue().getInternalTaskIdList().add(
-                    createTask(vdsReturnValue.getCreationInfo(),
+                    createTask(taskId,
+                            vdsReturnValue.getCreationInfo(),
                             VdcActionType.RemoveVmTemplate,
                             VdcObjectType.Storage,
                             getParameters().getStorageDomainId()));
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
index dc00016..a9ec6ae 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
@@ -106,6 +106,10 @@
             Guid imageGroupId = getDiskImage().getimage_group_id() != null ? 
getDiskImage().getimage_group_id()
                     .getValue() : Guid.Empty;
 
+            Guid taskId = 
this.createAsyncTask(VdcActionType.RestoreAllSnapshots,
+                                VdcObjectType.Storage,
+                                storageDomainId);
+
             vdsReturnValue = runVdsCommand(
                             VDSCommandType.DestroyImage,
                             new 
DestroyImageVDSCommandParameters(storagePoolId, storageDomainId, imageGroupId,
@@ -114,7 +118,8 @@
 
             if (vdsReturnValue.getSucceeded()) {
                 getReturnValue().getInternalTaskIdList().add(
-                        createTask(vdsReturnValue.getCreationInfo(),
+                        createTask(taskId,
+                                vdsReturnValue.getCreationInfo(),
                                 VdcActionType.RestoreAllSnapshots,
                                 VdcObjectType.Storage,
                                 storageDomainId));
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 7b3bd61..e74704a 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
@@ -254,6 +254,8 @@
                                 }
                             }).size() > 0;
 
+            Guid taskId1 = this.createAsyncTask(parentCommand, 
VdcObjectType.Storage, imagesList[0]);
+
             // delete first image
             // the next 'DeleteImageGroup' command should also take care of the
             // image removal:
@@ -267,9 +269,10 @@
             }
 
             Guid guid1 =
-                    createTask(vdsRetValue1.getCreationInfo(), parentCommand, 
VdcObjectType.Storage, imagesList[0]);
+                    createTask(taskId1, vdsRetValue1.getCreationInfo(), 
parentCommand, VdcObjectType.Storage, imagesList[0]);
             getTaskIdList().add(guid1);
 
+            Guid taskId2 = this.createAsyncTask(parentCommand);
             // delete second image
             // the next 'DeleteImageGroup' command should also take care of the
             // image removal:
@@ -285,7 +288,7 @@
                 return false;
             }
 
-            Guid guid2 = createTask(vdsRetValue2.getCreationInfo(), 
parentCommand);
+            Guid guid2 = createTask(taskId2, vdsRetValue2.getCreationInfo(), 
parentCommand);
             getTaskIdList().add(guid2);
 
             if (startPollingTasks) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
index bb29f21..521692a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
@@ -76,11 +76,20 @@
     }
 
     @Override
-    public Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo,
+    public Guid createAsyncTask(
             VdcActionType parentCommand,
             VdcObjectType entityType,
             Guid... entityIds) {
-        return super.createTask(asyncTaskCreationInfo, parentCommand, 
entityType, entityIds);
+        return super.createAsyncTask(parentCommand, entityType, entityIds);
+    }
+
+    @Override
+    public Guid createTask(Guid taskId,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
+            VdcActionType parentCommand,
+            VdcObjectType entityType,
+            Guid... entityIds) {
+        return super.createTask(taskId, asyncTaskCreationInfo, parentCommand, 
entityType, entityIds);
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
index f620a88..834c26b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
@@ -70,11 +70,21 @@
     }
 
     @Override
-    public Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo,
+    public Guid createTask(
+            Guid taskId,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand,
             VdcObjectType entityType,
             Guid... entityIds) {
-        return super.createTask(asyncTaskCreationInfo, parentCommand, 
entityType, entityIds);
+        return super.createTask(taskId, asyncTaskCreationInfo, parentCommand, 
entityType, entityIds);
+    }
+
+    @Override
+    public Guid createAsyncTask(
+            VdcActionType parentCommand,
+            VdcObjectType entityType,
+            Guid... entityIds) {
+        return super.createAsyncTask(parentCommand, entityType, entityIds);
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java
index 0c90808..ac93578 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java
@@ -29,7 +29,7 @@
      * @return
      */
     public static SPMAsyncTask Construct(CommandCoordinator coco, 
AsyncTaskCreationInfo creationInfo) {
-        AsyncTasks asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().get(creationInfo.getVdsmTaskId());
+        AsyncTasks asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().getByVdsmTaskId(creationInfo.getVdsmTaskId());
         if (asyncTask == null || asyncTask.getActionParameters() == null) {
             asyncTask =
                     new AsyncTasks(VdcActionType.Unknown,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
index 76b621e..014ea5a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
@@ -1,6 +1,9 @@
 package org.ovirt.engine.core.bll.tasks;
 
 import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.businessentities.AsyncTasks;
+import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
@@ -31,6 +34,24 @@
         }
     }
 
+    public static void addOrUpdateTaskInDB(AsyncTasks task,
+            VdcObjectType entityType,
+            Guid... entityIds) {
+        try {
+            if (task != null) {
+                DbFacade.getInstance()
+                        .getAsyncTaskDao()
+                        .saveOrUpdate(task,
+                                entityType,
+                                entityIds);
+            }
+        } catch (RuntimeException e) {
+            log.error(String.format(
+                    "Adding/Updating task %1$s to DataBase threw an 
exception.",
+                    task.getTaskId()), e);
+        }
+    }
+
     private static final Log log = LogFactory.getLog(AsyncTaskUtils.class);
 
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
index ab02588..e57e3aa 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
@@ -35,6 +35,7 @@
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.NGuid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
 import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
@@ -42,7 +43,7 @@
 
 public class CommandCoordinatorImpl extends CommandCoordinator {
 
-private static final String EXECUTION_CONTEXT_MAP_NAME = "executionContext";
+    private static final String EXECUTION_CONTEXT_MAP_NAME = 
"executionContext";
     private static final CommandCoordinatorImpl instance = new 
CommandCoordinatorImpl();
     private static final Log log = 
LogFactory.getLog(CommandCoordinatorImpl.class);
 
@@ -69,23 +70,29 @@
                 executionContextMap.put(stepId, context);
             }
             if (stepId != null) {
-                CommandEntity commandEntity = commandEntityDAO.get(stepId);
-                if (!actionType.equals(commandEntity.getActionType())) {
-                    throw new RuntimeException("action types dont match");
-                } else {
-                    log.info("in CommandManager.endAction action types match " 
+ actionType.toString());
-                }
-                if (!parameters.equals(commandEntity.getParameters())) {
-                    throw new RuntimeException("parameters dont match");
-                } else {
-                    log.info("in CommandManager.endAction parameters match " + 
parameters.toString());
-                }
+                debugCommandEntity(commandEntityDAO.get(stepId), actionType, 
parameters);
             }
             CommandBase<?> command = 
CommandsFactory.getInstance().CreateCommand(actionType, parameters);
             command.setContext(new CommandContext(context));
             return new DecoratedCommand(command, dbAsyncTask).endAction();
         } finally {
             commandEntityDAO.remove(stepId);
+        }
+    }
+
+    private void debugCommandEntity(CommandEntity commandEntity, VdcActionType 
actionType, VdcActionParametersBase parameters) {
+        if (commandEntity == null) {
+            return;
+        }
+        if (!actionType.equals(commandEntity.getActionType())) {
+            throw new RuntimeException("action types dont match");
+        } else {
+            log.info("in CommandManager.endAction action types match " + 
actionType.toString());
+        }
+        if (!parameters.equals(commandEntity.getParameters())) {
+            throw new RuntimeException("parameters dont match");
+        } else {
+            log.info("in CommandManager.endAction parameters match " + 
parameters.toString());
         }
     }
 
@@ -131,6 +138,28 @@
         return executionContextMap.containsKey(stepId);
     }
 
+    public Guid createAsyncTask(
+            CommandBase command,
+            VdcActionType parentCommand,
+            VdcObjectType entityType,
+            Guid... entityIds) {
+        Guid retValue = Guid.Empty;
+
+        Transaction transaction = TransactionSupport.suspend();
+
+        try {
+            AsyncTasks task = createAsyncTask(command, new 
AsyncTaskCreationInfo(), parentCommand);
+            retValue = task.getTaskId();
+            AsyncTaskUtils.addOrUpdateTaskInDB(task, entityType, entityIds);
+        } catch (RuntimeException ex) {
+            log.errorFormat("Error during createAsyncTask for command: {0}. 
Exception {1}", this.getClass().getName(), ex);
+        } finally {
+            TransactionSupport.resume(transaction);
+        }
+
+        return retValue;
+    }
+
     /**
      * Use this method in order to create task in the AsyncTaskManager in a 
safe
      * way. If you use this method within a certain command, make sure that the
@@ -146,6 +175,7 @@
      * @return Guid of the created task.
      */
     public Guid createTask(
+            Guid taskId,
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand,
@@ -162,7 +192,7 @@
             if (taskStep != null) {
                 asyncTaskCreationInfo.setStepId(taskStep.getId());
             }
-            SPMAsyncTask task = concreteCreateTask(command, 
asyncTaskCreationInfo, parentCommand);
+            SPMAsyncTask task = concreteCreateTask(taskId, command, 
asyncTaskCreationInfo, parentCommand);
             retValue = task.getVdsmTaskId();
             task.setEntityType(entityType);
             task.setAssociatedEntities(entityIds);
@@ -192,16 +222,46 @@
      * @return An {@link SPMAsyncTask} object representing the task to be run
      */
     public SPMAsyncTask concreteCreateTask(
+            Guid taskId,
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand) {
+        AsyncTaskParameters p =
+                new AsyncTaskParameters(asyncTaskCreationInfo,
+                getAsyncTask(taskId, command, asyncTaskCreationInfo, 
parentCommand));
+        p.setEntityId(command.getParameters().getEntityId());
+        return CreateTask(internalGetTaskType(command), p);
+    }
 
+    private AsyncTasks getAsyncTask(
+            Guid taskId,
+            CommandBase command,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
+            VdcActionType parentCommand) {
+        AsyncTasks asyncTask = null;
+        if (!taskId.equals(Guid.Empty)) {
+            asyncTask = DbFacade.getInstance().getAsyncTaskDao().get(taskId);
+        }
+        if (asyncTask != null) {
+            asyncTask.setVdsmTaskId(asyncTaskCreationInfo.getVdsmTaskId());
+            asyncTask.setStepId(asyncTaskCreationInfo.getStepId());
+            
asyncTask.setStoragePoolId(asyncTaskCreationInfo.getStoragePoolID());
+            asyncTask.setTaskType(asyncTaskCreationInfo.getTaskType());
+        } else {
+            asyncTask = createAsyncTask(command, asyncTaskCreationInfo, 
parentCommand);
+        }
+        return asyncTask;
+    }
+
+    private AsyncTasks createAsyncTask(
+            CommandBase command,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
+            VdcActionType parentCommand) {
         VdcActionParametersBase parentParameters = 
command.getParametersForTask(parentCommand, command.getParameters());
         if (parentParameters.getParametersCurrentUser() == null && 
command.getCurrentUser() != null) {
             
parentParameters.setParametersCurrentUser(command.getCurrentUser());
         }
-        AsyncTaskParameters p =
-                new AsyncTaskParameters(asyncTaskCreationInfo, new 
AsyncTasks(parentCommand,
+        return new AsyncTasks(parentCommand,
                 AsyncTaskResultEnum.success,
                 AsyncTaskStatusEnum.running,
                 asyncTaskCreationInfo.getVdsmTaskId(),
@@ -209,9 +269,7 @@
                 command.getParameters(),
                 asyncTaskCreationInfo.getStepId(),
                 command.getCommandId(), 
asyncTaskCreationInfo.getStoragePoolID(),
-                asyncTaskCreationInfo.getTaskType()));
-        p.setEntityId(command.getParameters().getEntityId());
-        return CreateTask(internalGetTaskType(command), p);
+                asyncTaskCreationInfo.getTaskType());
     }
 
     public SPMAsyncTask CreateTask(AsyncTaskType taskType, AsyncTaskParameters 
taskParameters) {
@@ -309,15 +367,13 @@
     private AsyncTaskManager getAsyncTaskManager() {
         return AsyncTaskManager.getInstance(this);
     }
-
     private final Map<Object, EntityMultiAsyncTasks> multiTasksByEntities =
             new HashMap<Object, EntityMultiAsyncTasks>();
-
     private static final Object _lockObject = new Object();
 
     @Override
     public boolean buildEntityMultiAsyncTasksIfNotExists(Object containerId) {
-        synchronized(_lockObject) {
+        synchronized (_lockObject) {
             if (!multiTasksByEntities.containsKey(containerId)) {
                 multiTasksByEntities.put(containerId, new 
EntityMultiAsyncTasks(containerId));
                 return true;
@@ -328,14 +384,14 @@
 
     @Override
     public EntityMultiAsyncTasks getEntityMultiAsyncTasks(Object containerId) {
-        synchronized(_lockObject) {
+        synchronized (_lockObject) {
             return multiTasksByEntities.get(containerId);
         }
     }
 
     @Override
     public void removeEntityMultiAsyncTasks(Object containerId) {
-        synchronized(_lockObject) {
+        synchronized (_lockObject) {
             multiTasksByEntities.remove(containerId);
         }
     }
@@ -406,6 +462,7 @@
                 new SPMTaskGuidBaseVDSCommandParameters(storagePoolID, 
taskID)).getReturnValue();
         return (AsyncTaskStatus) ((tempVar instanceof AsyncTaskStatus) ? 
tempVar : null);
     }
+
     @Override
     public Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID) {
         return (Map<Guid, AsyncTaskStatus>) 
runVdsCommand(VDSCommandType.SPMGetAllTasksStatuses,
@@ -415,5 +472,4 @@
     private BackendInternal getBackend() {
         return Backend.getInstance();
     }
-
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
index 98974e9..3f2fdb8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
@@ -20,9 +20,14 @@
 
     void setExecutionContext(ExecutionContext executionContext);
 
-    Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo,
+    Guid createTask(Guid taskId,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand,
             VdcObjectType entityType,
             Guid... entityIds);
 
+    Guid createAsyncTask(
+            VdcActionType parentCommand,
+            VdcObjectType entityType,
+            Guid... entityIds);
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java
index 18e64fa..0491f54 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java
@@ -44,12 +44,23 @@
         return getAsyncTaskManager().pollTasks(taskIdList);
     }
 
+    public static Guid createAsyncTask(
+            CommandBase command,
+            VdcActionType parentCommand,
+            VdcObjectType entityType,
+            Guid... entityIds) {
+        return CommandCoordinatorImpl.getInstance().createAsyncTask(command, 
parentCommand, entityType, entityIds);
+    }
+
     public static Guid createTask(
+            Guid taskId,
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand,
             String description, VdcObjectType entityType, Guid... entityIds) {
-        return CommandCoordinatorImpl.getInstance().createTask(command,
+        return CommandCoordinatorImpl.getInstance().createTask(
+                taskId,
+                command,
                 asyncTaskCreationInfo,
                 parentCommand,
                 description,
@@ -58,10 +69,13 @@
     }
 
     public static SPMTask concreteCreateTask(
+            Guid taskId,
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand) {
-        return CommandCoordinatorImpl.getInstance().concreteCreateTask(command,
+        return CommandCoordinatorImpl.getInstance().concreteCreateTask(
+                taskId,
+                command,
                 asyncTaskCreationInfo,
                 parentCommand);
     }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
index 79841c7..8b6e9011 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
@@ -158,7 +158,7 @@
 
         AsyncTaskCreationInfo info = nextAsyncTaskCreationInfo();
 
-        SPMTask spmAsyncTask = cmd.concreteCreateTask(info, 
cmd.getParameters().getParentCommand());
+        SPMTask spmAsyncTask = cmd.concreteCreateTask(Guid.Empty, info, 
cmd.getParameters().getParentCommand());
         assertEquals("wrong storage pool ID", info.getStoragePoolID(), 
spmAsyncTask.getStoragePoolID());
         assertEquals("wrong task ID", info.getVdsmTaskId(), 
spmAsyncTask.getVdsmTaskId());
         assertEquals("wrong task result", AsyncTaskResultEnum.success, 
spmAsyncTask.getLastTaskStatus().getResult());
@@ -180,7 +180,7 @@
         PermissionsOperationsParametes params = new 
PermissionsOperationsParametes();
         AddPermissionCommand<PermissionsOperationsParametes> cmd = spy(
                 new 
AddPermissionCommand<PermissionsOperationsParametes>(params));
-        cmd.concreteCreateTask(nextAsyncTaskCreationInfo(), 
VdcActionType.Unknown);
+        cmd.concreteCreateTask(Guid.Empty, nextAsyncTaskCreationInfo(), 
VdcActionType.Unknown);
     }
 
     /** @return A randomly generated {@link AsyncTaskCreationInfo} object */
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java
index 4a214ce..cc750ea 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java
@@ -17,8 +17,8 @@
     public AsyncTaskCreationInfo() {
     }
 
-    public AsyncTaskCreationInfo(Guid taskID, AsyncTaskType taskType, Guid 
storagePoolID) {
-        setVdsmTaskId(taskID);
+    public AsyncTaskCreationInfo(Guid vdsmTaskID, AsyncTaskType taskType, Guid 
storagePoolID) {
+        setVdsmTaskId(vdsmTaskID);
         setTaskType(taskType);
         setStoragePoolID(storagePoolID);
     }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibc5a548cb53172e6399f4334f24163dd855291ab
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Ravi Nori <rn...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to