Liron Aravot has uploaded a new change for review.

Change subject: tmp
......................................................................

tmp

Change-Id: I38c65fc154292edf571620eb7d68c205b7466463
Signed-off-by: Liron Aravot <lara...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneDiskWithDataCommandCallback.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommandCallBack.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommandCallback.java
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/ImagesHandler.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OneByOneCommandCallback.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupsCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/AllocateVolumeVDSCommandParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CopyVolumeDataVDSCommandParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/AllocateVolumeVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVolumeVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
41 files changed, 1,464 insertions(+), 59 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/07/37807/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
index 814fb9d..3e622f7 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
@@ -458,8 +458,16 @@
             addDiskPermissions(diskImage);
             getReturnValue().setActionReturnValue(diskImage.getId());
         }
-        getReturnValue().setFault(tmpRetValue.getFault());
-        setSucceeded(tmpRetValue.getSucceeded());
+
+        if (!tmpRetValue.getSucceeded()) {
+            getReturnValue().setFault(tmpRetValue.getFault());
+            setSucceeded(tmpRetValue.getSucceeded());
+            return;
+        }
+
+        if (taskList.isEmpty()) {
+            endSuccessfully();
+        }
     }
 
     /**
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 bb7e8a3..2e2fece 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
@@ -1,16 +1,22 @@
 package org.ovirt.engine.core.bll;
 
-import org.ovirt.engine.core.bll.context.CommandContext;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
+import java.util.Random;
 
+import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.AddImageFromScratchParameters;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.ImageStatus;
-import 
org.ovirt.engine.core.common.vdscommands.CreateImageVDSCommandParameters;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VDSStatus;
+import org.ovirt.engine.core.common.businessentities.VolumeType;
+import 
org.ovirt.engine.core.common.vdscommands.AllocateVolumeVDSCommandParameters;
+import 
org.ovirt.engine.core.common.vdscommands.CreateVolumeVDSCommandParameters;
+import 
org.ovirt.engine.core.common.vdscommands.SetVolumeDescriptionVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
@@ -19,7 +25,7 @@
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
 @InternalCommandAttribute
-@NonTransactiveCommandAttribute(forceCompensation=true)
+@NonTransactiveCommandAttribute(forceCompensation = true)
 public class AddImageFromScratchCommand<T extends 
AddImageFromScratchParameters> extends CreateSnapshotCommand<T> {
 
     public AddImageFromScratchCommand(T parameters, CommandContext 
commandContext) {
@@ -92,26 +98,60 @@
     protected boolean processImageInIrs() {
         Guid taskId = getAsyncTaskId();
         String diskDescription = 
getParameters().getDiskInfo().getDiskDescription();
-        VDSReturnValue vdsReturnValue = runVdsCommand(
-                        VDSCommandType.CreateImage,
-                        new 
CreateImageVDSCommandParameters(getParameters().getStoragePoolId(), 
getParameters()
-                                .getStorageDomainId(), getImageGroupId(), 
getParameters().getDiskInfo().getSize(),
-                                getParameters().getDiskInfo().getVolumeType(), 
getParameters().getDiskInfo()
-                                        .getVolumeFormat(), 
getDestinationImageId(), diskDescription != null ? diskDescription : ""));
-        if (vdsReturnValue.getSucceeded()) {
-            getParameters().setVdsmTaskIds(new ArrayList<Guid>());
-            getParameters().getVdsmTaskIds().add(
-                    createTask(taskId,
-                            vdsReturnValue.getCreationInfo(),
-                            getParameters().getParentCommand(),
-                            VdcObjectType.Storage,
-                            getParameters().getStorageDomainId()));
-            
getReturnValue().getInternalVdsmTaskIdList().add(getParameters().getVdsmTaskIds().get(0));
+        // VDSReturnValue vdsReturnValue = runVdsCommand(
+        // VDSCommandType.CreateImage,
+        // new 
CreateImageVDSCommandParameters(getParameters().getStoragePoolId(), 
getParameters()
+        // .getStorageDomainId(), getImageGroupId(), 
getParameters().getDiskInfo().getSize(),
+        // getParameters().getDiskInfo().getVolumeType(), 
getParameters().getDiskInfo()
+        // .getVolumeFormat(), getDestinationImageId(), diskDescription != 
null ? diskDescription : ""));
+        VDSReturnValue vdsReturnValue =
+                runVdsCommand(
+                        VDSCommandType.CreateVolume,
+                        new 
CreateVolumeVDSCommandParameters(getParameters().getStoragePoolId(),
+                                getParameters()
+                                        .getStorageDomainId(),
+                                getImageGroupId(),
+                                getParameters().getDiskInfo().getSize(),
+                                getParameters().getDiskInfo().getVolumeType(),
+                                getParameters().getDiskInfo()
+                                        .getVolumeFormat(),
+                                getDestinationImageId(),
+                                diskDescription != null ? diskDescription : 
""));
+        if (!vdsReturnValue.getSucceeded()) {
+            // getParameters().setVdsmTaskIds(new ArrayList<Guid>());
+            // getParameters().getVdsmTaskIds().add(
+            // createTask(taskId,
+            // vdsReturnValue.getCreationInfo(),
+            // getParameters().getParentCommand(),
+            // VdcObjectType.Storage,
+            // getParameters().getStorageDomainId()));
+            // 
getReturnValue().getInternalVdsmTaskIdList().add(getParameters().getVdsmTaskIds().get(0));
 
-            return true;
+            return false;
         }
 
-        return false;
+        if (getParameters().getDiskInfo().getVolumeType() == 
VolumeType.Preallocated) {
+            vdsReturnValue =
+                    runVdsCommand(VDSCommandType.AllocateVolume,
+                            new 
AllocateVolumeVDSCommandParameters(selectHost(),
+                                    getParameters().getStoragePoolId(),
+                                    getParameters().getStorageDomainId(),
+                                    getImageGroupId(),
+                                    getDestinationImageId(),
+                                    getParameters().getDiskInfo().getSize()));
+            if (vdsReturnValue.getSucceeded()) {
+                getParameters().setVdsmTaskIds(new ArrayList<Guid>());
+                getParameters().getVdsmTaskIds().add(
+                        createTask(taskId,
+                                vdsReturnValue.getCreationInfo(),
+                                getParameters().getParentCommand(),
+                                VdcObjectType.Storage,
+                                getParameters().getStorageDomainId()));
+                
getReturnValue().getInternalVdsmTaskIdList().add(getParameters().getVdsmTaskIds().get(0));
+            }
+        }
+
+        return true;
     }
 
     @Override
@@ -131,4 +171,22 @@
         }
 
     }
+
+    public VDSReturnValue setDesc() {
+        return runVdsCommand(VDSCommandType.SetVolumeDescription,
+                new SetVolumeDescriptionVDSCommandParameters(
+                        getParameters().getStoragePoolId(),
+                        getParameters().getStorageDomainId(),
+                        getImageGroupId(),
+                        getDestinationImageId(),
+                        "LIRON"));
+    }
+
+    protected Guid selectHost() {
+        List<VDS> hosts = DbFacade.getInstance()
+                .getVdsDao()
+                
.getAllForStoragePoolAndStatus(getParameters().getStoragePoolId(), 
VDSStatus.Up);
+        VDS selectedHost = hosts.remove(new Random().nextInt(hosts.size()));
+        return selectedHost.getId();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneDiskWithDataCommandCallback.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneDiskWithDataCommandCallback.java
new file mode 100644
index 0000000..1d64da1
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneDiskWithDataCommandCallback.java
@@ -0,0 +1,76 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.List;
+
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.CommandEntity;
+import org.ovirt.engine.core.compat.CommandStatus;
+import org.ovirt.engine.core.compat.Guid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloneDiskWithDataCommandCallback extends CommandCallBack {
+
+    private static final Logger log = 
LoggerFactory.getLogger(CloneImageGroupVolumesCommandCallBack.class);
+
+    private CommandBase<?> getCommand(Guid cmdId) {
+        return CommandCoordinatorUtil.retrieveCommand(cmdId);
+    }
+
+    @Override
+    public void doPolling(Guid cmdId, List<Guid> childCmdIds) {
+        CommandBase<?> command = getCommand(cmdId);
+        if (childCmdIds.isEmpty()) {
+            CloneImageGroupVolumesCommandParameters params = new 
CloneImageGroupVolumesCommandParameters();
+            params.setParentCommand(command.getActionType());
+            params.setParentParameters(command.getParameters());
+            CommandCoordinatorUtil.executeAsyncCommand(
+                    VdcActionType.CloneImageGroupVolumes,
+                    params,
+                    command.cloneContextAndDetachFromParent());
+            return;
+        }
+
+        // we know that we execute only one command
+        CommandBase<?> childCommand = getCommand(childCmdIds.get(0));
+
+        switch (childCommand.getCommandStatus()) {
+            case NOT_STARTED:
+            case ACTIVE:
+                log.info("Waiting on CopyVolumeData child commands to 
complete");
+                return;
+            case FAILED:
+            case FAILED_RESTARTED:
+            case UNKNOWN:
+                break;
+            default:
+                CommandEntity cmdEntity = 
CommandCoordinatorUtil.getCommandEntity(childCommand.getCommandId());
+                if (cmdEntity.isCallBackNotified()) {
+                    break;
+                } else {
+                    log.info("Waiting on CloneImageGroupVolumes child command 
to finalize");
+                    return;
+                }
+        }
+
+        
command.getParameters().setTaskGroupSuccess(childCommand.getSucceeded());
+        command.setCommandStatus(command.getParameters().getTaskGroupSuccess() 
? CommandStatus.FAILED : CommandStatus.SUCCEEDED);
+        log.info("All clone disk with data operations commands have completed, 
status '{}'",
+                command.getCommandStatus());
+    }
+
+    @Override
+    public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) {
+        getCommand(cmdId).endAction();
+        CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId);
+    }
+
+    @Override
+    public void onFailed(Guid cmdId, List<Guid> childCmdIds) {
+        getCommand(cmdId).endAction();
+        CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
new file mode 100644
index 0000000..458755e
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
@@ -0,0 +1,70 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.ArrayList;
+
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
+import 
org.ovirt.engine.core.common.vdscommands.CopyVolumeDataVDSCommandParameters;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import org.ovirt.engine.core.compat.Guid;
+
+public class CloneImageGroupVolumeCommand<T extends 
MoveOrCopyImageGroupParameters> extends BaseImagesCommand<T> {
+
+    public CloneImageGroupVolumeCommand(T parameters, CommandContext 
cmdContext) {
+        super(parameters, cmdContext);
+        setImageId(getParameters().getImageId());
+        setImageGroupId(getParameters().getImageGroupID());
+    }
+
+    public CloneImageGroupVolumeCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    @Override
+    protected void executeCommand() {
+        createVolume();
+        copyDataFromSrcVolume();
+    }
+
+    private void createVolume() {
+//        runVdsCommand(
+//                VDSCommandType.CreateVolume,
+//                new 
CreateVolumeVDSCommandParameters(getParameters().getStoragePoolId(),
+//                        getParameters()
+//                                .getStorageDomainId(),
+//                        getImageGroupId(),
+//                        getImage().getSize(),
+//                        getImage().getVolumeType(),
+//                        getImage()
+//                                .getVolumeFormat(),
+//                        getDestinationImageId(),
+//                        getImage().getDescription() != null ? 
getImage().getDescription() : ""));
+    }
+
+    private void copyDataFromSrcVolume() {
+        persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+        VDSReturnValue vdsReturnValue = runVdsCommand(
+                VDSCommandType.CopyVolumeData,
+                new 
CopyVolumeDataVDSCommandParameters(getParameters().getStoragePoolId(),
+                        getParameters()
+                                .getSourceDomainId(),
+                        getParameters().getImageGroupID(),
+                        getParameters().getImageId(),
+                        getParameters().getStorageDomainId(),
+                        getParameters().getDestImageGroupId(),
+                        getParameters().getDestinationImageId()));
+
+        if (vdsReturnValue.getSucceeded()) {
+            getParameters().setVdsmTaskIds(new ArrayList<Guid>());
+            getParameters().getVdsmTaskIds().add(
+                    createTask(getAsyncTaskId(),
+                            vdsReturnValue.getCreationInfo(),
+                            getParameters().getParentCommand(),
+                            VdcObjectType.Storage,
+                            getParameters().getStorageDomainId()));
+            
getReturnValue().getInternalVdsmTaskIdList().add(getParameters().getVdsmTaskIds().get(0));
+        }
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
new file mode 100644
index 0000000..58d9ddd
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
@@ -0,0 +1,64 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters;
+import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.ImageStatus;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+
+public class CloneImageGroupVolumesCommand<T extends 
CloneImageGroupVolumesCommandParameters> extends BaseImagesCommand<T> {
+    public CloneImageGroupVolumesCommand(T parameters, CommandContext 
cmdContext) {
+        super(parameters, cmdContext);
+    }
+
+    public CloneImageGroupVolumesCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    @Override
+    public CommandCallBack getCallBack() {
+        return new CloneImageGroupVolumesCommandCallBack();
+
+    }
+
+    @Override
+    protected void executeCommand() {
+        
getParameters().setImageIds(ImagesHandler.getDiskImageIds(DbFacade.getInstance()
+                .getDiskImageDao()
+                
.getAllSnapshotsForImageGroup(getParameters().getImageGroupID())));
+
+        persistCommand(getParameters().getParentCommand(), true);
+        setSucceeded(true);
+    }
+
+    private VdcActionParametersBase buildChildCommandParams(Guid imageId) {
+        MoveOrCopyImageGroupParameters params = new 
MoveOrCopyImageGroupParameters();
+        params.setParentCommand(getActionType());
+        params.setParentParameters(getParameters());
+        return params;
+    }
+
+    public void performNextCopy(int completedChildren) {
+        if (completedChildren == 0) {
+            // Lock all disk images in advance
+            ImagesHandler.updateAllDiskImageSnapshotsStatus(getImageGroupId(), 
ImageStatus.LOCKED);
+        }
+
+        Guid imageId = getParameters().getImageIds().get(completedChildren);
+        log.info("Starting child command {} of {}, image '{}'",
+                completedChildren + 1, getParameters().getImageIds().size(), 
imageId);
+
+        VdcActionParametersBase parameters = buildChildCommandParams(imageId);
+        persistCommand(getParameters().getParentCommand(), true);
+
+        CommandCoordinatorUtil.executeAsyncCommand(
+                VdcActionType.CloneImageGroupVolume,
+                parameters,
+                cloneContextAndDetachFromParent());
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommandCallBack.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommandCallBack.java
new file mode 100644
index 0000000..d0a09eb
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommandCallBack.java
@@ -0,0 +1,70 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.List;
+
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters;
+import org.ovirt.engine.core.common.businessentities.CommandEntity;
+import org.ovirt.engine.core.compat.CommandStatus;
+import org.ovirt.engine.core.compat.Guid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloneImageGroupVolumesCommandCallBack extends CommandCallBack {
+
+    private static final Logger log = 
LoggerFactory.getLogger(CloneImageGroupVolumesCommandCallBack.class);
+
+    @Override
+    public void doPolling(Guid cmdId, List<Guid> childCmdIds) {
+        boolean anyFailed = false;
+        int completedChildren = 0;
+        for (Guid childCmdId : childCmdIds) {
+            switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) {
+            case NOT_STARTED:
+            case ACTIVE:
+                log.info("Waiting on CopyVolumeData child commands to 
complete");
+                return;
+            case FAILED:
+            case FAILED_RESTARTED:
+            case UNKNOWN:
+                anyFailed = true;
+                break;
+            default:
+                CommandEntity cmdEntity = 
CommandCoordinatorUtil.getCommandEntity(childCmdId);
+                if (cmdEntity.isCallBackNotified()) {
+                    ++completedChildren;
+                    break;
+                } else {
+                    log.info("Waiting on CopyVolumeData child command to 
finalize");
+                    return;
+                }
+            }
+        }
+
+        CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters> 
command = getCommand(cmdId);
+        if (!anyFailed && completedChildren < 
command.getParameters().getImageIds().size()) {
+            command.performNextCopy(completedChildren);
+            return;
+        }
+
+        command.getParameters().setTaskGroupSuccess(!anyFailed);
+        command.setCommandStatus(anyFailed ? CommandStatus.FAILED : 
CommandStatus.SUCCEEDED);
+        log.info("All CopyVolumeData child commands have completed for Disk 
'{}', status '{}'",
+                command.getParameters().getImageGroupID(), 
command.getCommandStatus());
+    }
+
+    private 
CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters> 
getCommand(Guid cmdId) {
+        return 
(CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters>) 
CommandCoordinatorUtil.retrieveCommand(cmdId);
+    }
+
+    @Override
+    public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) {
+        getCommand(cmdId).endAction();
+    }
+
+    @Override
+    public void onFailed(Guid cmdId, List<Guid> childCmdIds) {
+        getCommand(cmdId).endAction();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommand.java
new file mode 100644
index 0000000..7a3f44d
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommand.java
@@ -0,0 +1,64 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters;
+import org.ovirt.engine.core.common.action.CloneImageGroupsCommandParameters;
+import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.ImageStatus;
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+
+public class CloneImageGroupsCommand<T extends 
CloneImageGroupsCommandParameters> extends BaseImagesCommand<T> {
+    public CloneImageGroupsCommand(T parameters, CommandContext cmdContext) {
+        super(parameters, cmdContext);
+    }
+
+    public CloneImageGroupsCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    @Override
+    public CommandCallBack getCallBack() {
+        return new CloneImageGroupVolumesCommandCallBack();
+
+    }
+
+    @Override
+    protected void executeCommand() {
+        persistCommand(getParameters().getParentCommand(), true);
+        setSucceeded(true);
+    }
+
+    private VdcActionParametersBase buildChildCommandParams(Guid imageId) {
+        CloneImageGroupVolumesCommandParameters params = new 
CloneImageGroupVolumesCommandParameters();
+        params.setParentCommand(getActionType());
+        params.setParentParameters(getParameters());
+        return params;
+    }
+
+    public void performNextCopy(int completedChildren) {
+        if (completedChildren == 0) {
+            for (Pair<DiskImage, Guid> p: 
getParameters().getImageGroupsWithDomains()) {
+                
ImagesHandler.updateAllDiskImageSnapshotsStatus(p.getFirst().getId(), 
ImageStatus.LOCKED);
+            }
+        }
+
+        Guid imageId = 
getParameters().getImageGroupsWithDomains().get(completedChildren).getFirst().getId();
+        log.info("Starting child command {} of {}, image '{}'",
+                completedChildren + 1, 
getParameters().getImageGroupsWithDomains().size(), imageId);
+
+        VdcActionParametersBase parameters = buildChildCommandParams(imageId);
+        persistCommand(getParameters().getParentCommand(), true);
+
+        CommandCoordinatorUtil.executeAsyncCommand(
+                VdcActionType.CloneImageGroupVolumes,
+                parameters,
+                cloneContextAndDetachFromParent());
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommandCallback.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommandCallback.java
new file mode 100644
index 0000000..d6e1e3a
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommandCallback.java
@@ -0,0 +1,5 @@
+package org.ovirt.engine.core.bll;
+
+public class CloneImageGroupsCommandCallback {
+
+}
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 5acfad3..0120bcd 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
@@ -13,6 +13,7 @@
 import org.ovirt.engine.core.bll.memory.MemoryUtils;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.storage.StoragePoolValidator;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.bll.utils.ClusterUtils;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.bll.validator.DiskImagesValidator;
@@ -59,8 +60,6 @@
 import org.ovirt.engine.core.utils.linq.LinqUtils;
 import org.ovirt.engine.core.utils.linq.Predicate;
 import org.ovirt.engine.core.utils.ovf.OvfManager;
-import org.ovirt.engine.core.utils.transaction.TransactionMethod;
-import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
 @DisableInPrepareMode
 @NonTransactiveCommandAttribute(forceCompensation = true)
@@ -181,6 +180,11 @@
         return true;
     }
 
+    @Override
+    public CommandCallBack getCallBack() {
+        return new CloneDiskWithDataCommandCallback();
+    }
+
     private boolean handleDestStorageDomain(List<DiskImage> disksList) {
         ensureDomainMap(disksList, getStorageDomainId());
         List<DiskImage> dummiesDisksList = 
createDiskDummiesForSpaceValidations(disksList);
@@ -226,30 +230,37 @@
 
     @Override
     protected void executeCommand() {
-        VmHandler.lockVm(getVm().getDynamicData(), getCompensationContext());
-        freeLock();
+//        VmHandler.lockVm(getVm().getDynamicData(), getCompensationContext());
+//        freeLock();
+//
+//        // update vm init
+//        VmHandler.updateVmInitFromDB(getVm().getStaticData(), true);
+//
+//        // Means that there are no asynchronous tasks to execute - so we can 
end the command
+//        // immediately after the execution of the previous steps
+//        if (!hasSnappableDisks() && snapshotsWithMemory.isEmpty()) {
+//            endSuccessfully();
+//        } else {
+//            TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+//
+//                @Override
+//                public Void runInTransaction() {
+//                    moveOrCopyAllImageGroups();
+//                    return null;
+//                }
+//            });
+//
+//            if (!getReturnValue().getVdsmTaskIdList().isEmpty()) {
+//                setSucceeded(true);
+//            }
+//        }
 
-        // update vm init
-        VmHandler.updateVmInitFromDB(getVm().getStaticData(), true);
+        moveOrCopyAllImageGroups2();
+    }
 
-        // Means that there are no asynchronous tasks to execute - so we can 
end the command
-        // immediately after the execution of the previous steps
-        if (!hasSnappableDisks() && snapshotsWithMemory.isEmpty()) {
-            endSuccessfully();
-        } else {
-            TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
-
-                @Override
-                public Void runInTransaction() {
-                    moveOrCopyAllImageGroups();
-                    return null;
-                }
-            });
-
-            if (!getReturnValue().getVdsmTaskIdList().isEmpty()) {
-                setSucceeded(true);
-            }
-        }
+    protected void moveOrCopyAllImageGroups2() {
+        persistCommand(getParameters().getParentCommand(), true);
+        setSucceeded(true);
     }
 
     private boolean hasSnappableDisks() {
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 fcbeff6..33dd861 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
@@ -249,8 +249,8 @@
      * @param diskImages collection of DiskImages
      * @return list of image IDs
      */
-    public static Collection<Guid> getDiskImageIds(Collection<DiskImage> 
diskImages) {
-        Collection<Guid> result = new ArrayList<>();
+    public static List<Guid> getDiskImageIds(List<DiskImage> diskImages) {
+        List<Guid> result = new ArrayList<>();
         if (diskImages != null) {
             for (DiskImage diskImage : diskImages) {
                 result.add(diskImage.getImageId());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OneByOneCommandCallback.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OneByOneCommandCallback.java
new file mode 100644
index 0000000..c07b18a
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OneByOneCommandCallback.java
@@ -0,0 +1,73 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.List;
+
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters;
+import org.ovirt.engine.core.common.businessentities.CommandEntity;
+import org.ovirt.engine.core.compat.CommandStatus;
+import org.ovirt.engine.core.compat.Guid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created by laravot on 2/15/15.
+ */
+public abstract class OneByOneCommandCallback extends CommandCallBack {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void doPolling(Guid cmdId, List<Guid> childCmdIds) {
+        boolean anyFailed = false;
+        int completedChildren = 0;
+        for (Guid childCmdId : childCmdIds) {
+            switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) {
+                case NOT_STARTED:
+                case ACTIVE:
+                    log.info("Waiting on CopyVolumeData child commands to 
complete");
+                    return;
+                case FAILED:
+                case FAILED_RESTARTED:
+                case UNKNOWN:
+                    anyFailed = true;
+                    break;
+                default:
+                    CommandEntity cmdEntity = 
CommandCoordinatorUtil.getCommandEntity(childCmdId);
+                    if (cmdEntity.isCallBackNotified()) {
+                        ++completedChildren;
+                        break;
+                    } else {
+                        log.info("Waiting on CopyVolumeData child command to 
finalize");
+                        return;
+                    }
+            }
+        }
+
+        CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters> 
command = getCommand(cmdId);
+        if (!anyFailed && completedChildren < 
command.getParameters().getImageIds().size()) {
+            command.performNextCopy(completedChildren);
+            return;
+        }
+
+        command.getParameters().setTaskGroupSuccess(!anyFailed);
+        command.setCommandStatus(anyFailed ? CommandStatus.FAILED : 
CommandStatus.SUCCEEDED);
+        log.info("All CopyVolumeData child commands have completed for Disk 
'{}', status '{}'",
+                command.getParameters().getImageGroupID(), 
command.getCommandStatus());
+    }
+
+    private 
CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters> 
getCommand(Guid cmdId) {
+        return 
(CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters>) 
CommandCoordinatorUtil.retrieveCommand(cmdId);
+    }
+
+    @Override
+    public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) {
+        getCommand(cmdId).endAction();
+    }
+
+    @Override
+    public void onFailed(Guid cmdId, List<Guid> childCmdIds) {
+        getCommand(cmdId).endAction();
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
index b75a46a..d1032d8 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
@@ -1097,7 +1097,10 @@
     MAC_POOL_EDIT_SUCCESS(10702),
     MAC_POOL_EDIT_FAILED(10703, AuditLogSeverity.ERROR),
     MAC_POOL_REMOVE_SUCCESS(10704),
-    MAC_POOL_REMOVE_FAILED(10705, AuditLogSeverity.ERROR);
+    MAC_POOL_REMOVE_FAILED(10705, AuditLogSeverity.ERROR),
+
+    SYSTEM_CHANGE_STORAGE_POOL_STATUS_UP_REPORTING_HOSTS(10706, 
AuditLogSeverity.NORMAL),
+    SYSTEM_CHANGE_STORAGE_POOL_STATUS_NON_RESPONSIVE_NO_REPORTING_HOSTS(10707, 
AuditLogSeverity.ALERT);
 
     private int intValue;
     // indicates time interval in seconds on which identical events from same 
instance are suppressed.
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
index dc54867..65bebc4 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
@@ -459,4 +459,13 @@
     public static boolean migrationCompression(Version version) {
         return supportedInConfig(ConfigValues.MigrationCompressionSupported, 
version);
     }
+
+    /**
+     * @param version
+     *            Compatibility version to check for.
+     * @return <code>true</code> if data center without spm is supported for 
the given version
+     */
+    public static boolean dataCenterWithoutSpm(Version version) {
+        return supportedInConfig(ConfigValues.DataCenterWithoutSpm, version);
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
new file mode 100644
index 0000000..940b614
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
@@ -0,0 +1,24 @@
+package org.ovirt.engine.core.common.action;
+
+import java.util.List;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class CloneImageGroupVolumesCommandParameters extends 
ImagesContainterParametersBase {
+    private List<Guid> imageIds;
+
+    public CloneImageGroupVolumesCommandParameters(List<Guid> images) {
+        this.imageIds = images;
+    }
+
+    public CloneImageGroupVolumesCommandParameters() {
+    }
+
+    public List<Guid> getImageIds() {
+        return imageIds;
+    }
+
+    public void setImageIds(List<Guid> imageIds) {
+        this.imageIds = imageIds;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupsCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupsCommandParameters.java
new file mode 100644
index 0000000..0c5d827
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupsCommandParameters.java
@@ -0,0 +1,27 @@
+package org.ovirt.engine.core.common.action;
+
+import java.util.List;
+import java.util.Set;
+
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
+
+public class CloneImageGroupsCommandParameters extends 
ImagesContainterParametersBase {
+    private List<Pair<DiskImage, Guid>> imageGroupsWithDomains;
+
+    public CloneImageGroupsCommandParameters(List<Pair<DiskImage, Guid>> 
imageGroupsWithDomains) {
+        this.imageGroupsWithDomains = imageGroupsWithDomains;
+    }
+
+    public CloneImageGroupsCommandParameters() {
+    }
+
+    public List<Pair<DiskImage, Guid>> getImageGroupsWithDomains() {
+        return imageGroupsWithDomains;
+    }
+
+    public void setImageGroupsWithDomains(List<Pair<DiskImage, Guid>> 
imageGroupsWithDomains) {
+        this.imageGroupsWithDomains = imageGroupsWithDomains;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
index b5195f8..d05d5ea 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
@@ -212,7 +212,7 @@
         return entityInfo;
     }
 
-    public void setEntityInfo(EntityInfo value) {
+    public void  setEntityInfo(EntityInfo value) {
         entityInfo = value;
     }
 
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index 23dc3e1..a0f06f0 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -139,6 +139,8 @@
     TryBackToAllSnapshotsOfVm(223, ActionGroup.MANIPULATE_VM_SNAPSHOTS, 
QuotaDependency.NONE),
     RestoreAllSnapshots(224, ActionGroup.MANIPULATE_VM_SNAPSHOTS, 
QuotaDependency.STORAGE),
     CopyImageGroup(225, QuotaDependency.STORAGE),
+    CloneImageGroupVolume(226, QuotaDependency.STORAGE),
+    CloneImageGroupVolumes(227, QuotaDependency.STORAGE),
     MoveOrCopyDisk(228, QuotaDependency.STORAGE),
     RemoveSnapshotSingleDisk(227, QuotaDependency.STORAGE),
     CreateCloneOfTemplate(229, QuotaDependency.STORAGE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
index 8650c0f..809415f 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
@@ -4,6 +4,8 @@
     unknown,
     copyImage,
     moveImage,
+    allocateVolume,
+    copyVolumeData,
     createVolume,
     deleteVolume,
     deleteImage,
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
index 332f1e2..b4dea21 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
@@ -1975,5 +1975,9 @@
     @DefaultValueAttribute("false")
     DefaultMigrationCompression,
 
+    @TypeConverterAttribute(Boolean.class)
+    @DefaultValueAttribute("true")
+    DataCenterWithoutSpm,
+
     Invalid
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
index 6a9fadf..b6ccd48 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
@@ -28,6 +28,8 @@
     SYNC_LUNS,
     /** This group is used for indication that an operation is executed using 
the specified host */
     VDS_EXECUTION,
+    /** This group is used for indication that a storage manipulating 
operation is executed on a domain */
+    DOMAIN_EXECUTION,
     VDS_POOL_AND_STORAGE_CONNECTIONS;
 
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/AllocateVolumeVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/AllocateVolumeVDSCommandParameters.java
new file mode 100644
index 0000000..a3a5171
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/AllocateVolumeVDSCommandParameters.java
@@ -0,0 +1,43 @@
+package org.ovirt.engine.core.common.vdscommands;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class AllocateVolumeVDSCommandParameters extends 
StorageDomainVdsCommandParameters {
+    private Guid imageGroupId;
+    private Guid volumeId;
+    private long sizeInBytes;
+
+    public AllocateVolumeVDSCommandParameters(Guid vdsId, Guid storagePoolId, 
Guid storageDomainId, Guid imageGroupId, Guid volumeId, long sizeInBytes) {
+        super(storagePoolId, storageDomainId, vdsId);
+        this.imageGroupId = imageGroupId;
+        this.volumeId = volumeId;
+        this.sizeInBytes = sizeInBytes;
+    }
+
+    public AllocateVolumeVDSCommandParameters() {
+    }
+
+    public Guid getImageGroupId() {
+        return imageGroupId;
+    }
+
+    public void setImageGroupId(Guid imageGroupId) {
+        this.imageGroupId = imageGroupId;
+    }
+
+    public Guid getVolumeId() {
+        return volumeId;
+    }
+
+    public void setVolumeId(Guid volumeId) {
+        this.volumeId = volumeId;
+    }
+
+    public long getSizeInBytes() {
+        return sizeInBytes;
+    }
+
+    public void setSizeInBytes(long sizeInBytes) {
+        this.sizeInBytes = sizeInBytes;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CopyVolumeDataVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CopyVolumeDataVDSCommandParameters.java
new file mode 100644
index 0000000..8172840
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CopyVolumeDataVDSCommandParameters.java
@@ -0,0 +1,65 @@
+package org.ovirt.engine.core.common.vdscommands;
+
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class CopyVolumeDataVDSCommandParameters extends 
StorageDomainVdsCommandParameters {
+    private Guid srcImageGroupId;
+    private Guid srcImageId;
+    private Guid dstStorageDomainId;
+    private Guid dstImageGroupId;
+    private Guid dstImageId;
+
+    public CopyVolumeDataVDSCommandParameters() {
+    }
+
+    public CopyVolumeDataVDSCommandParameters(Guid storagePoolId, Guid 
storageDomainId, Guid srcImageGroupId,
+                                              Guid srcImageId, Guid 
dstStorageDomainId, Guid dstImageGroupId, Guid dstImageId) {
+        super(storagePoolId, storageDomainId, null);
+        this.srcImageGroupId = srcImageGroupId;
+        this.srcImageId = srcImageId;
+        this.dstStorageDomainId = dstStorageDomainId;
+        this.dstImageGroupId = dstImageGroupId;
+        this.dstImageId = dstImageId;
+    }
+
+    public Guid getSrcImageGroupId() {
+        return srcImageGroupId;
+    }
+
+    public void setSrcImageGroupId(Guid srcImageGroupId) {
+        this.srcImageGroupId = srcImageGroupId;
+    }
+
+    public Guid getSrcImageId() {
+        return srcImageId;
+    }
+
+    public void setSrcImageId(Guid srcImageId) {
+        this.srcImageId = srcImageId;
+    }
+
+    public Guid getDstStorageDomainId() {
+        return dstStorageDomainId;
+    }
+
+    public void setDstStorageDomainId(Guid dstStorageDomainId) {
+        this.dstStorageDomainId = dstStorageDomainId;
+    }
+
+    public Guid getDstImageGroupId() {
+        return dstImageGroupId;
+    }
+
+    public void setDstImageGroupId(Guid dstImageGroupId) {
+        this.dstImageGroupId = dstImageGroupId;
+    }
+
+    public Guid getDstImageId() {
+        return dstImageId;
+    }
+
+    public void setDstImageId(Guid dstImageId) {
+        this.dstImageId = dstImageId;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
new file mode 100644
index 0000000..2ca8fcc
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
@@ -0,0 +1,117 @@
+package org.ovirt.engine.core.common.vdscommands;
+
+import org.ovirt.engine.core.common.businessentities.VolumeFormat;
+import org.ovirt.engine.core.common.businessentities.VolumeType;
+import org.ovirt.engine.core.compat.Guid;
+
+public class CreateVolumeVDSCommandParameters extends 
StorageDomainVdsCommandParameters {
+
+    private long imageSizeInBytes;
+    private VolumeType imageType;
+    private Guid newImageID;
+    private Guid srcVolume;
+    private Guid srcImageGroupId;
+    private Guid imageGroupId;
+
+    public CreateVolumeVDSCommandParameters(Guid storagePoolId, Guid 
storageDomainId, Guid imageGroupId,
+            long imageSizeInBytes, VolumeType imageType, VolumeFormat 
volFormat, Guid newImageId,
+            String newImageDescription) {
+        super(storagePoolId, storageDomainId, null);
+        this.imageSizeInBytes = imageSizeInBytes;
+        this.imageType = imageType;
+        this.setVolumeFormat(volFormat);
+        this.setImageGroupId(imageGroupId);
+        setNewImageID(newImageId);
+        setNewImageDescription(newImageDescription);
+    }
+
+    public long getImageSizeInBytes() {
+        return imageSizeInBytes;
+    }
+
+    public VolumeType getImageType() {
+        return imageType;
+    }
+
+    private VolumeFormat privateVolumeFormat;
+
+    public VolumeFormat getVolumeFormat() {
+        return privateVolumeFormat;
+    }
+
+    protected void setVolumeFormat(VolumeFormat value) {
+        privateVolumeFormat = value;
+    }
+
+    public Guid getNewImageID() {
+        return newImageID;
+    }
+
+    protected void setNewImageID(Guid value) {
+        newImageID = value;
+    }
+
+    private String newImageDescription;
+
+    public String getNewImageDescription() {
+        return newImageDescription;
+    }
+
+    protected void setNewImageDescription(String value) {
+        newImageDescription = value;
+    }
+
+    public void setImageSizeInBytes(long imageSizeInBytes) {
+        this.imageSizeInBytes = imageSizeInBytes;
+    }
+
+    public void setImageType(VolumeType imageType) {
+        this.imageType = imageType;
+    }
+
+    public Guid getSrcVolume() {
+        return srcVolume;
+    }
+
+    public void setSrcVolume(Guid srcVolume) {
+        this.srcVolume = srcVolume;
+    }
+
+    public Guid getSrcImageGroupId() {
+        return srcImageGroupId;
+    }
+
+    public void setSrcImageGroupId(Guid srcImageGroupId) {
+        this.srcImageGroupId = srcImageGroupId;
+    }
+
+    public VolumeFormat getPrivateVolumeFormat() {
+        return privateVolumeFormat;
+    }
+
+    public void setPrivateVolumeFormat(VolumeFormat privateVolumeFormat) {
+        this.privateVolumeFormat = privateVolumeFormat;
+    }
+
+    public Guid getImageGroupId() {
+        return imageGroupId;
+    }
+
+    public void setImageGroupId(Guid imageGroupId) {
+        this.imageGroupId = imageGroupId;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s, imageSizeInBytes = %s, volumeFormat = %s, 
newImageId = %s, " +
+                "newImageDescription = %s",
+                super.toString(),
+                getImageSizeInBytes(),
+                getVolumeFormat(),
+                getNewImageID(),
+                getNewImageDescription());
+    }
+
+    public CreateVolumeVDSCommandParameters() {
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
new file mode 100644
index 0000000..8610263
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
@@ -0,0 +1,33 @@
+package org.ovirt.engine.core.common.vdscommands;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class StorageDomainVdsCommandParameters extends 
VdsIdVDSCommandParametersBase {
+    Guid storagePoolId;
+    Guid storageDomainId;
+
+    public Guid getStoragePoolId() {
+        return storagePoolId;
+    }
+
+    public void setStoragePoolId(Guid storagePoolId) {
+        this.storagePoolId = storagePoolId;
+    }
+
+    public Guid getStorageDomainId() {
+        return storageDomainId;
+    }
+
+    public void setStorageDomainId(Guid storageDomainId) {
+        this.storageDomainId = storageDomainId;
+    }
+
+    public StorageDomainVdsCommandParameters(Guid storagePoolId, Guid 
storageDomainId, Guid vdsId) {
+        super(vdsId);
+        this.storagePoolId = storagePoolId;
+        this.storageDomainId = storageDomainId;
+    }
+
+    public StorageDomainVdsCommandParameters() {
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
index 2c41867..0ce058e 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
@@ -55,6 +55,9 @@
     HSMGetStorageDomainInfo("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     HSMGetStorageDomainsList("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     CreateImage("org.ovirt.engine.core.vdsbroker.irsbroker"),
+    CreateVolume("org.ovirt.engine.core.vdsbroker.vdsbroker"),
+    CopyVolumeData("org.ovirt.engine.core.vdsbroker.vdsbroker"),
+    AllocateVolume("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     DestroyImage("org.ovirt.engine.core.vdsbroker.irsbroker"),
     GetImageInfo("org.ovirt.engine.core.vdsbroker.irsbroker"),
     SetVolumeDescription("org.ovirt.engine.core.vdsbroker.irsbroker"),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java
index 22f961c..138a1c1 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java
@@ -13,6 +13,10 @@
         return _vdsId;
     }
 
+    public void setVdsId(Guid _vdsId) {
+        this._vdsId = _vdsId;
+    }
+
     public VdsIdVDSCommandParametersBase() {
     }
 
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
index a09da95..7cfa372 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
@@ -11,6 +11,9 @@
     OneUuidReturnForXmlRpc createVolume(String sdUUID, String spUUID, String 
imgGUID, String size, int volFormat,
             int volType, int diskType, String volUUID, String descr, String 
srcImgGUID, String srcVolUUID);
 
+    OneUuidReturnForXmlRpc createVolume2(String sdUUID, String spUUID, String 
imgGUID, String size, int volFormat,
+                                        int volType, int diskType, String 
volUUID, String descr, String srcImgGUID, String srcVolUUID);
+
     OneUuidReturnForXmlRpc copyImage(String sdUUID, String spUUID, String 
vmGUID, String srcImgGUID, String srcVolUUID,
             String dstImgGUID, String dstVolUUID, String descr, String 
dstSdUUID, int volType, int volFormat,
             int preallocate, String postZero, String force);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java
index fe9113e..3c31d91 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java
@@ -17,6 +17,7 @@
 
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
 import 
org.ovirt.engine.core.common.businessentities.BusinessEntitiesDefinitions;
@@ -164,6 +165,16 @@
                         TimeUnit.SECONDS);
     }
 
+
+    private void updateStoragePoolStatus(StoragePool pool, StoragePoolStatus 
status, AuditLogType auditLogType, VdcBllErrors error) {
+        ResourceManager
+                .getInstance()
+                .getEventListener()
+                .storagePoolStatusChange(pool.getId(), status,
+                        auditLogType,
+                        error);
+    }
+
     @OnTimerMethodAnnotation("_updatingTimer_Elapsed")
     public void _updatingTimer_Elapsed() {
         try {
@@ -172,6 +183,7 @@
                     StoragePool storagePool = 
DbFacade.getInstance().getStoragePoolDao()
                             .get(_storagePoolId);
 
+                    boolean poolStatusDeterminedByHostsStatus = 
FeatureSupported.dataCenterWithoutSpm(storagePool.getcompatibility_version());
                     if (storagePool != null) {
                         // when there are no hosts in status up, it means that 
there shouldn't be domain monitoring
                         // so all the domains need to move to "unknown" status 
as otherwise their status won't change.
@@ -182,11 +194,23 @@
                             
StoragePoolDomainHelper.updateApplicablePoolDomainsStatuses(_storagePoolId,
                                     
StoragePoolDomainHelper.storageDomainMonitoredStatus,
                                     StorageDomainStatus.Unknown, "no reporting 
hosts");
+                            if (poolStatusDeterminedByHostsStatus) {
+                                updateStoragePoolStatus(storagePool, 
StoragePoolStatus.NonResponsive,
+                                        
AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_NON_RESPONSIVE_NO_REPORTING_HOSTS,
+                                        VdcBllErrors.ENGINE);
+                            }
+                        }  else {
+                            if (poolStatusDeterminedByHostsStatus) {
+                                updateStoragePoolStatus(storagePool, 
StoragePoolStatus.Up,
+                                        
AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_UP_REPORTING_HOSTS,
+                                        null);
+                            }
                         }
 
-                        if (storagePool.getStatus() == StoragePoolStatus.Up
-                                || storagePool.getStatus() == 
StoragePoolStatus.NonResponsive || storagePool
-                                        .getStatus() == 
StoragePoolStatus.Contend) {
+                        if (!poolStatusDeterminedByHostsStatus &&
+                                storagePool.getStatus() == 
StoragePoolStatus.Up ||
+                                storagePool.getStatus() == 
StoragePoolStatus.NonResponsive ||
+                                storagePool.getStatus() == 
StoragePoolStatus.Contend) {
                             proceedStoragePoolStats(storagePool);
                         }
                     }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
index 1b7c709..285562c 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
@@ -9,6 +9,13 @@
     public Map<String, Object> createVolume(String sdUUID, String spUUID, 
String imgGUID, String size, int volFormat,
             int volType, int diskType, String volUUID, String descr, String 
srcImgGUID, String srcVolUUID);
 
+
+    public Map<String, Object> createVolume2(String sdUUID, String spUUID, 
String imgGUID, String size, int volFormat,
+                                            int volType, int diskType, String 
volUUID, String descr, String srcImgGUID, String srcVolUUID);
+
+    public Map<String, Object>  copyVolumeData(String sdUUID, String spUUID, 
String imgGUID, String volUUID, String dstSdUUID,
+                                          String dstImgGUID, String 
dstVolUUID);
+
     public Map<String, Object> copyImage(String sdUUID, String spUUID, String 
vmGUID, String srcImgGUID,
             String srcVolUUID, String dstImgGUID, String dstVolUUID, String 
descr);
 
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
index 7388e88..0649213 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
@@ -30,6 +30,15 @@
     }
 
     @Override
+    public OneUuidReturnForXmlRpc createVolume2(String sdUUID, String spUUID, 
String imgGUID, String size,
+                                               int volFormat, int volType, int 
diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID) {
+        Map<String, Object> xmlRpcReturnValue = 
irsServer.createVolume2(sdUUID, spUUID, imgGUID, size, volFormat,
+                volType, diskType, volUUID, descr, srcImgGUID, srcVolUUID);
+        OneUuidReturnForXmlRpc wrapper = new 
OneUuidReturnForXmlRpc(xmlRpcReturnValue);
+        return wrapper;
+    }
+
+    @Override
     public OneUuidReturnForXmlRpc copyImage(String sdUUID, String spUUID, 
String vmGUID, String srcImgGUID,
             String srcVolUUID, String dstImgGUID, String dstVolUUID, String 
descr, String dstSdUUID, int volType,
             int volFormat, int preallocate, String postZero, String force) {
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
index ab8b3a9..ad67af5 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
@@ -63,6 +63,37 @@
         return new OneUuidReturnForXmlRpc(response);
     }
 
+
+    @Override
+    public OneUuidReturnForXmlRpc createVolume2(String sdUUID,
+                                               String spUUID,
+                                               String imgGUID,
+                                               String size,
+                                               int volFormat,
+                                               int volType,
+                                               int diskType,
+                                               String volUUID,
+                                               String descr,
+                                               String srcImgGUID,
+                                               String srcVolUUID) {
+        JsonRpcRequest request =
+                new RequestBuilder("Volume.create").withParameter("volumeID", 
volUUID)
+                        .withParameter("storagepoolID", spUUID)
+                        .withParameter("storagedomainID", sdUUID)
+                        .withParameter("imageID", imgGUID)
+                        .withParameter("size", size)
+                        .withParameter("volFormat", volFormat)
+                        .withParameter("preallocate", volType)
+                        .withParameter("diskType", diskType)
+                        .withParameter("desc", descr)
+                        .withParameter("srcImgUUID", srcImgGUID)
+                        .withParameter("srcVolUUID", srcVolUUID)
+                        .build();
+        Map<String, Object> response =
+                new FutureMap(this.client, request).withResponseKey("uuid");
+        return new OneUuidReturnForXmlRpc(response);
+    }
+
     @Override
     public OneUuidReturnForXmlRpc copyImage(String sdUUID,
             String spUUID,
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
index 9e970e4..523bc61 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
@@ -105,6 +105,98 @@
     }
 
     @Override
+    public OneUuidReturnForXmlRpc createVolume(String sdUUID,
+                                                String spUUID,
+                                                String imgGUID,
+                                                String size,
+                                                int volFormat,
+                                                int volType,
+                                                int diskType,
+                                                String volUUID,
+                                                String descr,
+                                                String srcImgGUID,
+                                                String srcVolUUID) {
+        JsonRpcRequest request =
+                new RequestBuilder("Volume.create").withParameter("volumeID", 
volUUID)
+                        .withParameter("storagepoolID", spUUID)
+                        .withParameter("storagedomainID", sdUUID)
+                        .withParameter("imageID", imgGUID)
+                        .withParameter("size", size)
+                        .withParameter("volFormat", volFormat)
+                        .withParameter("preallocate", volType)
+                        .withParameter("diskType", diskType)
+                        .withParameter("desc", descr)
+                        .withParameter("srcImgUUID", srcImgGUID)
+                        .withParameter("srcVolUUID", srcVolUUID)
+                        .build();
+        Map<String, Object> response =
+                new FutureMap(this.client, request).withResponseKey("uuid");
+        return new OneUuidReturnForXmlRpc(response);
+    }
+
+    @Override
+    public OneUuidReturnForXmlRpc allocateVolume(String spUUID, String sdUUID, 
String imgGUID, String volUUID, String size) {
+        JsonRpcRequest request =
+                new 
RequestBuilder("Volume.allocate").withParameter("volumeID", volUUID)
+                        .withParameter("storagepoolID", spUUID)
+                        .withParameter("storagedomainID", sdUUID)
+                        .withParameter("imageID", imgGUID)
+                        .withParameter("size", size)
+                        .build();
+        Map<String, Object> response =
+                new FutureMap(this.client, request).withResponseKey("uuid");
+        return new OneUuidReturnForXmlRpc(response);
+    }
+
+    @Override
+    public OneUuidReturnForXmlRpc copyVolumeData(String sdUUID, String spUUID, 
String imgGUID, String volUUID, String dstSdUUID,
+                                                 String dstImgGUID, String 
dstVolUUID) {
+        JsonRpcRequest request =
+                new 
RequestBuilder("Volume.copyVolumeData").withParameter("volumeID", volUUID)
+                        .withParameter("storagepoolID", spUUID)
+                        .withParameter("storagedomainID", sdUUID)
+                        .withParameter("imageID", imgGUID)
+                        .withParameter("dstSdUUID", dstSdUUID)
+                        .withParameter("dstImgGUID", dstImgGUID)
+                        .withParameter("dstVolUUID", dstVolUUID)
+                        .build();
+        Map<String, Object> response =
+                new FutureMap(this.client, request).withResponseKey("uuid");
+        return new OneUuidReturnForXmlRpc(response);
+    }
+
+
+    @Override
+    public StatusOnlyReturnForXmlRpc createVolume2(String sdUUID,
+                                               String spUUID,
+                                               String imgGUID,
+                                               String size,
+                                               int volFormat,
+                                               int volType,
+                                               int diskType,
+                                               String volUUID,
+                                               String descr,
+                                               String srcImgGUID,
+                                               String srcVolUUID) {
+        JsonRpcRequest request =
+                new RequestBuilder("Volume.create2").withParameter("volumeID", 
volUUID)
+                        .withParameter("storagepoolID", spUUID)
+                        .withParameter("storagedomainID", sdUUID)
+                        .withParameter("imageID", imgGUID)
+                        .withParameter("size", size)
+                        .withParameter("volFormat", volFormat)
+                        .withParameter("preallocate", volType)
+                        .withParameter("diskType", diskType)
+                        .withParameter("desc", descr)
+                        .withParameter("srcImgUUID", srcImgGUID)
+                        .withParameter("srcVolUUID", srcVolUUID)
+                        .build();
+        Map<String, Object> response =
+                new FutureMap(this.client, request).withResponseKey("uuid");
+        return new StatusOnlyReturnForXmlRpc(response);
+    }
+
+    @Override
     public StatusOnlyReturnForXmlRpc destroy(String vmId) {
         JsonRpcRequest request = new 
RequestBuilder("VM.destroy").withParameter("vmID", vmId).build();
         Map<String, Object> response = new FutureMap(this.client, request);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/AllocateVolumeVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/AllocateVolumeVDSCommand.java
new file mode 100644
index 0000000..dd6bb89
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/AllocateVolumeVDSCommand.java
@@ -0,0 +1,44 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import 
org.ovirt.engine.core.common.vdscommands.AllocateVolumeVDSCommandParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc;
+
+public class AllocateVolumeVDSCommand<P extends 
AllocateVolumeVDSCommandParameters> extends VdsBrokerCommand<P> {
+    OneUuidReturnForXmlRpc uuidReturn;
+    public AllocateVolumeVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeVdsBrokerCommand() {
+        log.info("-- executeDomainCommand: calling 'allocateVolume'");
+        uuidReturn = getBroker().allocateVolume(
+                getParameters().getStoragePoolId().toString(),
+                getParameters().getStorageDomainId().toString(),
+                getParameters().getImageGroupId().toString(),
+                getParameters().getVolumeId().toString(),
+                Long.valueOf(getParameters().getSizeInBytes()).toString());
+
+            proceedProxyReturnValue();
+
+            Guid taskID = new Guid(uuidReturn.mUuid);
+
+            getVDSReturnValue().setCreationInfo(
+                    new AsyncTaskCreationInfo(taskID, 
AsyncTaskType.allocateVolume, getParameters()
+                            .getStoragePoolId()));
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return uuidReturn.mStatus;
+    }
+
+    @Override
+    protected Object getReturnValueFromBroker() {
+        return uuidReturn;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
new file mode 100644
index 0000000..281ecb6
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
@@ -0,0 +1,46 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import 
org.ovirt.engine.core.common.vdscommands.CopyVolumeDataVDSCommandParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc;
+
+public class CopyVolumeDataVDSCommand<P extends 
CopyVolumeDataVDSCommandParameters> extends VdsBrokerCommand<P> {
+    OneUuidReturnForXmlRpc uuidReturn;
+    public CopyVolumeDataVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeVdsBrokerCommand() {
+        log.info("-- executeDomainCommand: calling 'allocateCopyVolumeData'");
+//        uuidReturn = getBroker().copyVolumeData(
+//                getParameters().getStorageDomainId().toString(),
+//                getParameters().getStoragePoolId().toString(),
+//                getParameters().getSrcImageGroupId().toString(),
+//                getParameters().getSrcImageId().toString(),
+//                getParameters().getDstStorageDomainId().toString(),
+//                getParameters().getDstImageGroupId().toString(),
+//                getParameters().getDstImageId().toString());
+
+//       proceedProxyReturnValue();
+
+//        Guid taskID = new Guid(uuidReturn.mUuid);
+
+        Guid taskID = Guid.newGuid();
+        getVDSReturnValue().setCreationInfo(
+                new AsyncTaskCreationInfo(taskID, 
AsyncTaskType.copyVolumeData, getParameters()
+                        .getStoragePoolId()));
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return uuidReturn.mStatus;
+    }
+
+    @Override
+    protected Object getReturnValueFromBroker() {
+        return uuidReturn;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVolumeVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVolumeVDSCommand.java
new file mode 100644
index 0000000..6b520d7
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVolumeVDSCommand.java
@@ -0,0 +1,74 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+import 
org.ovirt.engine.core.common.vdscommands.CreateVolumeVDSCommandParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.vdsbroker.storage.StorageDomainHelper;
+
+public class CreateVolumeVDSCommand<P extends 
CreateVolumeVDSCommandParameters> extends StorageDomainMetadataCommand<P> {
+    public CreateVolumeVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+//    protected String mCreatedImageId = "";
+//    protected OneUuidReturnForXmlRpc uuidReturn;
+//
+//    @Override
+//    protected StatusForXmlRpc getReturnStatus() {
+//        return uuidReturn.mStatus;
+//    }
+//
+//    @Override
+//    protected Object getReturnValueFromBroker() {
+//        return uuidReturn;
+//    }
+
+    @Override
+    protected void executeDomainCommand() {
+        {
+            
StorageDomainHelper.checkNumberOfLVsForBlockDomain(getParameters().getStorageDomainId());
+            setReturnValue(Guid.Empty);
+
+            log.info("-- executeIrsBrokerCommand: calling 'createVolume'");
+            // NOTE: The 'uuidReturn' variable will contain the taskID and not 
the
+            // created image id!
+//            uuidReturn = getBroker().createVolume(
+//                    getParameters().getStorageDomainId().toString(),
+//                    getParameters().getStoragePoolId().toString(),
+//                    getParameters().getImageGroupId().toString(),
+//                    
(Long.valueOf(getParameters().getImageSizeInBytes())).toString(),
+//                    getParameters().getVolumeFormat().getValue(),
+//                    getParameters().getImageType().getValue(),
+//                    2,
+//                    getParameters().getNewImageID().toString(),
+//                    getParameters().getNewImageDescription(), 
Guid.Empty.toString(),
+//                    Guid.Empty.toString());
+//
+//            proceedProxyReturnValue();
+//
+//            Guid taskID = new Guid(uuidReturn.mUuid);
+//
+//            String mCreatedImageId = 
getParameters().getNewImageID().toString();
+//             setReturnValue(getParameters().getNewImageID().toString());
+//
+//            getVDSReturnValue().setCreationInfo(
+//                    new AsyncTaskCreationInfo(taskID, 
AsyncTaskType.createVolume, getParameters()
+//                            .getStoragePoolId()));
+
+            status = getBroker().createVolume2(
+                    getParameters().getStorageDomainId().toString(),
+                    getParameters().getStoragePoolId().toString(),
+                    getParameters().getImageGroupId().toString(),
+                    
(Long.valueOf(getParameters().getImageSizeInBytes())).toString(),
+                    getParameters().getVolumeFormat().getValue(),
+                    getParameters().getImageType().getValue(),
+                    2,
+                    getParameters().getNewImageID().toString(),
+                    getParameters().getNewImageDescription(), 
Guid.Empty.toString(),
+                    Guid.Empty.toString());
+
+            proceedProxyReturnValue();
+
+            setReturnValue(getParameters().getNewImageID().toString());
+        }
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
index 92619fa..5050017 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
@@ -32,6 +32,17 @@
 
     OneVmReturnForXmlRpc create(Map createInfo);
 
+    OneUuidReturnForXmlRpc createVolume(String sdUUID, String spUUID, String 
imgGUID, String size, int volFormat,
+                                         int volType, int diskType, String 
volUUID, String descr, String srcImgGUID, String srcVolUUID);
+
+    StatusOnlyReturnForXmlRpc createVolume2(String sdUUID, String spUUID, 
String imgGUID, String size, int volFormat,
+                                        int volType, int diskType, String 
volUUID, String descr, String srcImgGUID, String srcVolUUID);
+
+    OneUuidReturnForXmlRpc copyVolumeData(String sdUUID, String spUUID, String 
imgGUID, String volUUID, String dstSdUUID,
+                                          String dstImgGUID, String 
dstVolUUID);
+
+    OneUuidReturnForXmlRpc allocateVolume(String spUUID, String sdUUID, String 
imgGUID, String volUUID, String size);
+
     StatusOnlyReturnForXmlRpc destroy(String vmId);
 
     StatusOnlyReturnForXmlRpc shutdown(String vmId, String timeout, String 
message);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
new file mode 100644
index 0000000..3624935
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
@@ -0,0 +1,175 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.net.SocketException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VDSStatus;
+import org.ovirt.engine.core.common.config.Config;
+import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.common.errors.VDSError;
+import org.ovirt.engine.core.common.errors.VdcBLLException;
+import org.ovirt.engine.core.common.errors.VdcBllErrors;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.locks.LockingGroup;
+import org.ovirt.engine.core.common.utils.Pair;
+import 
org.ovirt.engine.core.common.vdscommands.StorageDomainVdsCommandParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.utils.lock.EngineLock;
+import org.ovirt.engine.core.utils.lock.LockManager;
+import org.ovirt.engine.core.utils.lock.LockManagerFactory;
+import org.ovirt.engine.core.utils.log.LoggedUtils;
+import org.ovirt.engine.core.vdsbroker.irsbroker.IRSErrorException;
+import org.ovirt.engine.core.vdsbroker.irsbroker.IRSGenericException;
+import org.ovirt.engine.core.vdsbroker.irsbroker.IRSNonOperationalException;
+import org.ovirt.engine.core.vdsbroker.irsbroker.IRSProtocolException;
+import org.ovirt.engine.core.vdsbroker.irsbroker.IRSStoragePoolStatusException;
+import org.ovirt.engine.core.vdsbroker.irsbroker.IRSUnicodeArgumentException;
+import 
org.ovirt.engine.core.vdsbroker.irsbroker.IrsOperationFailedNoFailoverException;
+import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcRunTimeException;
+
+public abstract class StorageDomainMetadataCommand<P extends 
StorageDomainVdsCommandParameters> extends VdsBrokerCommand<P> {
+
+    private List<VDS> hosts;
+    private int failover;
+
+    public StorageDomainMetadataCommand(P parameters) {
+        super(parameters);
+    }
+
+    protected void selectHost() {
+        if (getParameters().getVdsId() != null) {
+            return;
+        }
+
+        if (!getHostsForOperation().isEmpty()) {
+            VDS selectedHost = getHostsForOperation().remove(new 
Random().nextInt(getHostsForOperation().size()));
+            getParameters().setVdsId(selectedHost.getId());
+        }
+
+        if (getParameters().getVdsId() == null) {
+            throw new 
VdcBLLException(VdcBllErrors.RESOURCE_MANAGER_VDS_NOT_FOUND,
+                    String.format("No host was found to perform the 
operation"));
+        }
+    }
+
+    @Override
+    protected void executeVdsBrokerCommand() {
+        LockManager lockManager = LockManagerFactory.getLockManager();
+        EngineLock domainLock = 
buildLock(getParameters().getStorageDomainId(), LockingGroup.DOMAIN_EXECUTION);
+        try {
+            getLockManager().acquireLockWait(domainLock);
+            executeDomainCommand();
+        } finally {
+            lockManager.releaseLock(domainLock);
+        }
+    }
+
+    protected void failover() {
+        if (failover < Config
+                .<Integer> getValue(ConfigValues.SpmCommandFailOverRetries)) {
+            getParameters().setVdsId(null);
+            failover++;
+            executeCommand();
+        } else {
+            log.error("reached failover limit");
+            getVDSReturnValue().setSucceeded(false);
+        }
+    }
+
+    private void logException(Throwable ex) {
+        log.error("IrsBroker::Failed::{}: {}", getCommandName(), 
ex.getMessage());
+        log.debug("Exception", ex);
+    }
+
+    @Override
+    protected void executeVDSCommand() {
+        selectHost();
+        initVdsBroker(getParameters().getVdsId());
+        try {
+                executeDomainCommand();
+            }
+        catch (UndeclaredThrowableException ex) {
+                getVDSReturnValue().setExceptionString(ex.toString());
+                getVDSReturnValue().setExceptionObject(ex);
+                getVDSReturnValue().setVdsError(new 
VDSError(VdcBllErrors.VDS_NETWORK_ERROR, ex.getMessage()));
+                if (ExceptionUtils.getRootCause(ex) != null) {
+                    logException(ExceptionUtils.getRootCause(ex));
+                } else {
+                    LoggedUtils.logError(log, LoggedUtils.getObjectId(this), 
this, ex);
+                }
+                failover();
+        } catch (XmlRpcRunTimeException ex) {
+                getVDSReturnValue().setExceptionString(ex.toString());
+                getVDSReturnValue().setExceptionObject(ex);
+                if (ex.isNetworkError()) {
+                    log.error("IrsBroker::Failed::{} - network exception.", 
getCommandName());
+                    getVDSReturnValue().setSucceeded(false);
+                } else {
+                    log.error("IrsBroker::Failed::{}", getCommandName());
+                    LoggedUtils.logError(log, LoggedUtils.getObjectId(this), 
this, ex);
+                    throw new IRSProtocolException(ex);
+                }
+        } catch (IRSUnicodeArgumentException ex) {
+                throw new IRSGenericException("UNICODE characters are not 
supported.", ex);
+        } catch (IRSStoragePoolStatusException | 
IrsOperationFailedNoFailoverException ex) {
+                throw ex;
+        } catch (IRSNonOperationalException ex) {
+                getVDSReturnValue().setExceptionString(ex.toString());
+                getVDSReturnValue().setExceptionObject(ex);
+                getVDSReturnValue().setVdsError(ex.getVdsError());
+                logException(ex);
+                failover();
+        } catch (IRSErrorException ex) {
+                getVDSReturnValue().setExceptionString(ex.toString());
+                getVDSReturnValue().setExceptionObject(ex);
+                getVDSReturnValue().setVdsError(ex.getVdsError());
+                logException(ex);
+                if (log.isDebugEnabled()) {
+                    LoggedUtils.logError(log, LoggedUtils.getObjectId(this), 
this, ex);
+                }
+                failover();
+        } catch (RuntimeException ex) {
+                getVDSReturnValue().setExceptionString(ex.toString());
+                getVDSReturnValue().setExceptionObject(ex);
+                if (ex instanceof VDSExceptionBase) {
+                    getVDSReturnValue().setVdsError(((VDSExceptionBase) 
ex).getVdsError());
+                }
+                if (ExceptionUtils.getRootCause(ex) != null &&
+                        ExceptionUtils.getRootCause(ex) instanceof 
SocketException) {
+                    logException(ExceptionUtils.getRootCause(ex));
+                } else {
+                    LoggedUtils.logError(log, LoggedUtils.getObjectId(this), 
this, ex);
+                }
+                // always failover because of changes in vdsm error, until we
+                // realize what to do in each case:
+                failover();
+            }
+    }
+
+    private EngineLock buildLock(Guid id, LockingGroup lockingGroup) {
+        return new EngineLock(null,
+                Collections.singletonMap(id.toString(), new 
Pair<>(lockingGroup.toString(), 
VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.toString())));
+    }
+
+    private List<VDS> getHostsForOperation() {
+        if (hosts == null) {
+            hosts = DbFacade.getInstance()
+                    .getVdsDao()
+                    
.getAllForStoragePoolAndStatus(getParameters().getStoragePoolId(), 
VDSStatus.Up);
+        }
+
+        return hosts;
+    }
+
+    private LockManager getLockManager() {
+        return LockManagerFactory.getLockManager();
+    }
+
+    protected abstract void executeDomainCommand();
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java
index 8a3f24d..d5cf7a1 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java
@@ -1,5 +1,8 @@
 package org.ovirt.engine.core.vdsbroker.vdsbroker;
 
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VdsStatic;
@@ -13,11 +16,8 @@
 import org.ovirt.engine.core.vdsbroker.VdsManager;
 import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcRunTimeException;
 
-import javax.enterprise.event.Event;
-import javax.inject.Inject;
-
 public abstract class VdsBrokerCommand<P extends 
VdsIdVDSCommandParametersBase> extends BrokerCommandBase<P> {
-    private final IVdsServer mVdsBroker;
+    private IVdsServer mVdsBroker;
     private VdsStatic vdsStatic;
     private VDS vds;
     @Inject
@@ -30,7 +30,13 @@
      */
     public VdsBrokerCommand(P parameters) {
         super(parameters);
-        mVdsBroker = initializeVdsBroker(parameters.getVdsId());
+        initVdsBroker(getParameters().getVdsId());
+    }
+
+    protected void initVdsBroker(Guid id) {
+        if (id != null) {
+            mVdsBroker = initializeVdsBroker(id);
+        }
     }
 
     /**
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
index e97444b..eac6095 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
@@ -6,6 +6,17 @@
 public interface VdsServerConnector {
     public Map<String, Object> create(Map createInfo);
 
+    public Map<String, Object> createVolume(String sdUUID, String spUUID, 
String imgGUID, String size, int volFormat,
+                                            int volType, int diskType, String 
volUUID, String descr, String srcImgGUID, String srcVolUUID);
+
+    public Map<String, Object> createVolume2(String sdUUID, String spUUID, 
String imgGUID, String size, int volFormat,
+                                            int volType, int diskType, String 
volUUID, String descr, String srcImgGUID, String srcVolUUID);
+
+    public Map<String, Object> copyVolumeData(String sdUUID, String spUUID, 
String imgGUID, String volUUID, String dstSdUUID,
+                                          String dstImgGUID, String 
dstVolUUID);
+
+    public Map<String, Object> allocateVolume(String spUUID, String sdUUID, 
String imgGUID, String volUUID, String size);
+
     public Map<String, Object> destroy(String vmId);
 
     public Map<String, Object> shutdown(String vmId, String timeout, String 
message);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
index d027b50..4a42f7c 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
@@ -56,6 +56,40 @@
     }
 
     @Override
+    public OneUuidReturnForXmlRpc createVolume(String sdUUID, String spUUID, 
String imgGUID, String size,
+                                                int volFormat, int volType, 
int diskType, String volUUID, String descr, String srcImgGUID, String 
srcVolUUID) {
+        Map<String, Object> xmlRpcReturnValue = vdsServer.createVolume(sdUUID, 
spUUID, imgGUID, size, volFormat,
+                volType, diskType, volUUID, descr, srcImgGUID, srcVolUUID);
+        OneUuidReturnForXmlRpc wrapper = new 
OneUuidReturnForXmlRpc(xmlRpcReturnValue);
+        return wrapper;
+    }
+
+    @Override
+    public StatusOnlyReturnForXmlRpc createVolume2(String sdUUID, String 
spUUID, String imgGUID, String size,
+                                               int volFormat, int volType, int 
diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID) {
+        Map<String, Object> xmlRpcReturnValue = 
vdsServer.createVolume2(sdUUID, spUUID, imgGUID, size, volFormat,
+                volType, diskType, volUUID, descr, srcImgGUID, srcVolUUID);
+        StatusOnlyReturnForXmlRpc wrapper = new 
StatusOnlyReturnForXmlRpc(xmlRpcReturnValue);
+        return wrapper;
+    }
+
+    @Override
+    public OneUuidReturnForXmlRpc copyVolumeData(String sdUUID, String spUUID, 
String imgGUID, String volUUID, String dstSdUUID,
+                                          String dstImgGUID, String 
dstVolUUID) {
+        Map<String, Object> xmlRpcReturnValue = 
vdsServer.copyVolumeData(sdUUID, spUUID, imgGUID, volUUID, dstSdUUID,
+                dstImgGUID, dstVolUUID);
+        OneUuidReturnForXmlRpc wrapper = new 
OneUuidReturnForXmlRpc(xmlRpcReturnValue);
+        return wrapper;
+    }
+
+    @Override
+    public OneUuidReturnForXmlRpc allocateVolume(String spUUID, String sdUUID, 
String imgGUID, String volUUID, String size) {
+        Map<String, Object> xmlRpcReturnValue = 
vdsServer.allocateVolume(sdUUID, spUUID, imgGUID, volUUID, size);
+        OneUuidReturnForXmlRpc wrapper = new 
OneUuidReturnForXmlRpc(xmlRpcReturnValue);
+        return wrapper;
+    }
+
+    @Override
     public StatusOnlyReturnForXmlRpc destroy(String vmId) {
         try {
             Map<String, Object> xmlRpcReturnValue = vdsServer.destroy(vmId);
diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql 
b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
index 90b6e02..b347d98 100644
--- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
+++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
@@ -210,6 +210,7 @@
 select 
fn_db_add_config_value_for_versions_up_to('SerialNumberPolicySupported', 
'false', '3.4');
 
 select fn_db_add_config_value_for_versions_up_to('OvfStoreOnAnyDomain', 
'false', '3.4');
+select fn_db_add_config_value_for_versions_up_to('DataCenterWithoutSpm', 
'false', '3.5');
 select fn_db_add_config_value_for_versions_up_to('BootMenuSupported', 'false', 
'3.4');
 
 select fn_db_add_config_value_for_versions_up_to('IscsiMultipathingSupported', 
'false', '3.3');


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

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

Reply via email to