Liron Ar has uploaded a new change for review.

Change subject: core: restapi: introducing exportDiskBySnapshotAsBlockDevice
......................................................................

core: restapi: introducing exportDiskBySnapshotAsBlockDevice

*Missing tests
*Still debating whether it'll be pass in the command parameters image
uuid (==volume) instead of disk id + snapshotid

Change-Id: I2f96c2d8f4e0507383accfceff217e9719332607
Signed-off-by: Liron Aravot <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseDiskBySnapshotCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseDiskCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportDiskBySnapshotAsBlockDeviceCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/BaseDiskBySnapshotParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/BaseDiskParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportDiskBySnapshotAsBlockDeviceParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/PrepareForBackupParameters.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/errors/VdcBllMessages.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/SnapshotDiskResource.java
M 
backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDiskResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDisksResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotResource.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceReturnForXmlRpc.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceVDSCommandParameters.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.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/disk_images_sp.sql
A 
packaging/dbscripts/upgrade/03_03_0320_add_export_image_as_block_device_command.sql
26 files changed, 514 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/84/16284/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseDiskBySnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseDiskBySnapshotCommand.java
new file mode 100644
index 0000000..de41483
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseDiskBySnapshotCommand.java
@@ -0,0 +1,79 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
+import org.ovirt.engine.core.common.action.BaseDiskBySnapshotParameters;
+import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.Snapshot;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.DiskImageDAO;
+import org.ovirt.engine.core.dao.SnapshotDao;
+
+public abstract class BaseDiskBySnapshotCommand<T extends 
BaseDiskBySnapshotParameters> extends BaseDiskCommand<T>{
+
+    private DiskImage diskBySnapshot;
+    private Snapshot snapshot;
+
+    public BaseDiskBySnapshotCommand(T parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        if (!super.canDoAction()) {
+             return false;
+        }
+
+        if (getDisk().getDiskStorageType() != Disk.DiskStorageType.IMAGE) {
+            //TODO: add message
+            return false;
+        }
+
+        SnapshotsValidator snapshotsValidator = new SnapshotsValidator();
+        if (getParameters().getSnapshotId() != null && 
!snapshotsValidator.snapshotExists(getSnapshot()).isValid()) {
+           return false;
+        }
+
+        if (getDiskForSnapshot(getParameters().getSnapshotId()) == null) {
+            //TODO: add message
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * return the DiskImage of the given snapshot id
+     * if the snapshot id is null, the active DiskImage is returned.
+     * @param snapshotId
+     * @return
+     */
+    public DiskImage getDiskForSnapshot(Guid snapshotId) {
+        if (diskBySnapshot == null) {
+            if (snapshotId != null) {
+                diskBySnapshot = 
getDiskImageDao().getDiskSnapshotForVmSnapshot(getParameters().getDiskId(), 
getParameters().getSnapshotId());
+            } else {
+                diskBySnapshot = (DiskImage)getDisk();
+            }
+        }
+
+        return diskBySnapshot;
+    }
+
+    public Snapshot getSnapshot() {
+        if (snapshot == null) {
+            snapshot = getSnapshotDao().get(getParameters().getSnapshotId());
+        }
+
+        return snapshot;
+    }
+
+    protected DiskImageDAO getDiskImageDao() {
+        return DbFacade.getInstance().getDiskImageDao();
+    }
+
+    protected SnapshotDao getSnapshotDao() {
+        return DbFacade.getInstance().getSnapshotDao();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseDiskCommand.java
new file mode 100644
index 0000000..c06c03f
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseDiskCommand.java
@@ -0,0 +1,35 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.common.action.BaseDiskParameters;
+import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.DiskDao;
+
+public abstract class BaseDiskCommand <T extends BaseDiskParameters> extends 
CommandBase<T> {
+    protected Disk disk;
+
+    public BaseDiskCommand(T parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        if (getDisk() == null) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_DISK_NOT_EXIST);
+        }
+
+        return true;
+    }
+
+    protected Disk getDisk() {
+        if (disk == null) {
+            disk = getDiskDao().get(getParameters().getDiskId());
+        }
+        return disk;
+    }
+
+    protected DiskDao getDiskDao() {
+        return DbFacade.getInstance().getDiskDao();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportDiskBySnapshotAsBlockDeviceCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportDiskBySnapshotAsBlockDeviceCommand.java
new file mode 100644
index 0000000..fac1c85
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportDiskBySnapshotAsBlockDeviceCommand.java
@@ -0,0 +1,74 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.common.AuditLogType;
+import 
org.ovirt.engine.core.common.action.ExportDiskBySnapshotAsBlockDeviceParameters;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.VDSStatus;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import 
org.ovirt.engine.core.vdsbroker.vdsbroker.ExportImageAsBlockDeviceVDSCommandParameters;
+
+@NonTransactiveCommandAttribute
+public class ExportDiskBySnapshotAsBlockDeviceCommand<T extends 
ExportDiskBySnapshotAsBlockDeviceParameters> extends 
BaseDiskBySnapshotCommand<T> {
+
+    public ExportDiskBySnapshotAsBlockDeviceCommand(T parameters) {
+        super(parameters);
+        setVdsId(getParameters().getVdsId());
+    }
+
+    @Override
+    protected boolean canDoAction() {
+       if (!super.canDoAction()) {
+            return false;
+        }
+
+        if (getVds() == null) {
+            return failCanDoAction(VdcBllMessages.VDS_INVALID_SERVER_ID);
+        }
+
+        if (getVds().getStatus() != VDSStatus.Up) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VDS_NOT_MATCH_VALID_STATUS);
+        }
+
+        return true;
+    }
+
+    @Override
+    protected void executeCommand() {
+        DiskImage diskImage = 
getDiskForSnapshot(getParameters().getSnapshotId());
+        VDSReturnValue vdsReturnValue = 
runVdsCommand(VDSCommandType.ExportImageAsBlockDevice,
+                new 
ExportImageAsBlockDeviceVDSCommandParameters(getParameters().getVdsId(),
+                        diskImage.getStoragePoolId(),
+                        diskImage.getStorageIds().get(0),
+                        diskImage.getId(),
+                        diskImage.getImageId()));
+        setActionReturnValue(vdsReturnValue.getReturnValue());
+        setSucceeded(true);
+    }
+
+    @Override
+    public AuditLogType getAuditLogTypeValue() {
+        return getSucceeded() ? 
AuditLogType.USER_EXPORT_IMAGE_AS_BLOCK_DEVICE_SUCCEEDED : 
AuditLogType.USER_EXPORT_IMAGE_AS_BLOCK_DEVICE_FAILED;
+    }
+
+    @Override
+    protected boolean isUserAuthorizedToRunAction() {
+        return true;
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        // Not needed for admin operations.
+        return Collections.emptyList();
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__EXPORT_IMAGE_AS_BLOCK_DEVICE);
+    }
+}
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 58ff6c4..4ed4905 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
@@ -691,6 +691,10 @@
     USER_ACCOUNT_DISABLED_OR_LOCKED(1100, 
AuditLogTimeInterval.HOUR.getValue()),
     USER_ACCOUNT_PASSWORD_EXPIRED(1101, AuditLogTimeInterval.HOUR.getValue()),
 
+    // Backup
+    USER_EXPORT_IMAGE_AS_BLOCK_DEVICE_SUCCEEDED(1250),
+    USER_EXPORT_IMAGE_AS_BLOCK_DEVICE_FAILED(1251),
+
     // Providers
     PROVIDER_ADDED(1150),
     PROVIDER_ADDITION_FAILED(1151),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/BaseDiskBySnapshotParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/BaseDiskBySnapshotParameters.java
new file mode 100644
index 0000000..f2290b3
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/BaseDiskBySnapshotParameters.java
@@ -0,0 +1,21 @@
+package org.ovirt.engine.core.common.action;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class BaseDiskBySnapshotParameters extends BaseDiskParameters{
+
+    private Guid snapshotId;
+
+    public BaseDiskBySnapshotParameters(Guid diskId, Guid snapshotId) {
+        super(diskId);
+        this.snapshotId = snapshotId;
+    }
+
+    public Guid getSnapshotId() {
+        return snapshotId;
+    }
+
+    public void setSnapshotId(Guid snapshotId) {
+        this.snapshotId = snapshotId;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/BaseDiskParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/BaseDiskParameters.java
new file mode 100644
index 0000000..08dfd68
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/BaseDiskParameters.java
@@ -0,0 +1,22 @@
+package org.ovirt.engine.core.common.action;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class BaseDiskParameters extends VdcActionParametersBase {
+
+    private static final long serialVersionUID = 6566657546609823772L;
+
+    private Guid diskId;
+
+    public BaseDiskParameters(Guid diskId) {
+        this.diskId = diskId;
+    }
+
+    public Guid getDiskId() {
+        return diskId;
+    }
+
+    public void setDiskId(Guid diskId) {
+        this.diskId = diskId;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportDiskBySnapshotAsBlockDeviceParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportDiskBySnapshotAsBlockDeviceParameters.java
new file mode 100644
index 0000000..5dec9e6
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportDiskBySnapshotAsBlockDeviceParameters.java
@@ -0,0 +1,20 @@
+package org.ovirt.engine.core.common.action;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class ExportDiskBySnapshotAsBlockDeviceParameters extends 
BaseDiskBySnapshotParameters {
+    private Guid vdsId;
+
+    public ExportDiskBySnapshotAsBlockDeviceParameters(Guid diskId, Guid 
snapshotId, Guid vdsId) {
+        super(diskId, snapshotId);
+        this.vdsId = vdsId;
+    }
+
+    public Guid getVdsId() {
+        return vdsId;
+    }
+
+    public void setVdsId(Guid vdsId) {
+        this.vdsId = vdsId;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/PrepareForBackupParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/PrepareForBackupParameters.java
new file mode 100644
index 0000000..1a51864
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/PrepareForBackupParameters.java
@@ -0,0 +1,30 @@
+package org.ovirt.engine.core.common.action;
+
+import javax.validation.constraints.NotNull;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class PrepareForBackupParameters extends VmDiskOperationParameterBase {
+
+    private static final long serialVersionUID = 6007874805077449969L;
+
+    public PrepareForBackupParameters() {
+    }
+
+    @NotNull
+    private Guid diskId;
+
+    public PrepareForBackupParameters(Guid vmId, Guid diskId) {
+        super(vmId, null);
+        setDiskId(diskId);
+    }
+
+    public Guid getDiskId() {
+        return diskId;
+    }
+
+    public void setDiskId(Guid diskId) {
+        this.diskId = diskId;
+    }
+
+}
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 439bcff..00c2ebe 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
@@ -213,6 +213,7 @@
     LiveMigrateDisk(1010, QuotaDependency.NONE),
     LiveMigrateVmDisks(1011, false, QuotaDependency.STORAGE),
     MoveDisks(1012, false, QuotaDependency.NONE),
+    ExportDiskBySnapshotAsBlockDevice(1013, false, QuotaDependency.NONE),
     // Event Notification
     AddEventSubscription(1100, false, QuotaDependency.NONE),
     RemoveEventSubscription(1101, false, QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index 8fee683..38c5726 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -57,6 +57,7 @@
     VAR__ACTION__RESTART,
     VAR__ACTION__SHUTDOWN,
     VAR__ACTION__EXPORT,
+    VAR__ACTION__EXPORT_IMAGE_AS_BLOCK_DEVICE,
     VAR__ACTION__EXTEND,
     VAR__ACTION__IMPORT,
     VAR__ACTION__ATTACH_ACTION_TO,
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 d130d3b..4a0d1c3 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
@@ -108,6 +108,7 @@
     HotUnPlugDisk("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     HotPlugNic("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     HotUnplugNic("org.ovirt.engine.core.vdsbroker.vdsbroker"),
+    ExportImageAsBlockDevice("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     Snapshot("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     UpdateVmInterface("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     GetHardwareInfo("org.ovirt.engine.core.vdsbroker.vdsbroker"),
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java
index 3fc82ea..75d7103 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java
@@ -49,6 +49,17 @@
     List<DiskImage> getAllSnapshotsForVmSnapshot(Guid id);
 
     /**
+     * Retrieves the disk image with the image information for the given vm 
snapshot id.
+     *
+     * @param diskId
+     *            the disk id
+     * @param vmSnapshotId
+     *            the snapshot id
+     * @return the list of snapshots
+     */
+    DiskImage getDiskSnapshotForVmSnapshot(Guid diskId, Guid vmSnapshotId);
+
+    /**
      * Retrieves all snapshots associated with the given image group.
      *
      * @param id
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java
index 1139c09..cfcbf36 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java
@@ -70,6 +70,17 @@
     }
 
     @Override
+    public DiskImage getDiskSnapshotForVmSnapshot(Guid diskId, Guid 
vmSnapshotId) {
+        MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
+                .addValue("vm_snapshot_id", vmSnapshotId)
+                .addValue("image_group_id", diskId);
+
+        return getCallsHandler().executeRead("GetDiskSnapshotForVmSnapshot",
+                DiskImageRowMapper.instance,
+                parameterSource);
+    }
+
+    @Override
     public List<DiskImage> getAllSnapshotsForImageGroup(Guid id) {
         MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
                 .addValue("image_group_id", id);
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/SnapshotDiskResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/SnapshotDiskResource.java
index df7a5ad..da02c63 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/SnapshotDiskResource.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/SnapshotDiskResource.java
@@ -1,9 +1,15 @@
 package org.ovirt.engine.api.resource;
 
+import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
 
 import org.jboss.resteasy.annotations.providers.jaxb.Formatted;
+import org.ovirt.engine.api.model.Action;
+import org.ovirt.engine.api.model.Actionable;
 import org.ovirt.engine.api.model.Disk;
 
 @Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
@@ -13,4 +19,10 @@
     @Formatted
     public Disk get();
 
+    @POST
+    @Formatted
+    @Actionable
+    @Path("exportAsBlockDevice")
+    @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+    public Response exportAsBlockDevice(Action action);
 }
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
index 13441d0..c2248ca 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
@@ -654,6 +654,13 @@
       signatures: []
     urlparams: {}
     headers: {}
+- name: 
/api/vms/{vm:id}/snapshots/{snapshot:id}/disks/{disk:id}/exportAsBlockDevice|rel=get
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams: {}
+    headers: {}
 - name: /api/vms/{vm:id}/snapshots/{snapshot:id}/nics|rel=get
   request:
     body:
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDiskResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDiskResource.java
index ac6a353..cc5ca43 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDiskResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDiskResource.java
@@ -1,18 +1,22 @@
 package org.ovirt.engine.api.restapi.resource;
 
 import javax.ws.rs.WebApplicationException;
-
-import org.ovirt.engine.api.model.Disk;
-import org.ovirt.engine.api.resource.SnapshotDiskResource;
 import javax.ws.rs.core.Response;
 
-public class BackendSnapshotDiskResource implements SnapshotDiskResource {
+import org.ovirt.engine.api.model.Action;
+import org.ovirt.engine.api.model.Disk;
+import org.ovirt.engine.api.resource.SnapshotDiskResource;
+import 
org.ovirt.engine.core.common.action.ExportDiskBySnapshotAsBlockDeviceParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.compat.Guid;
+
+public class BackendSnapshotDiskResource extends 
AbstractBackendActionableResource<Disk, 
org.ovirt.engine.core.common.businessentities.Disk> implements 
SnapshotDiskResource {
 
     protected String diskId;
     protected BackendSnapshotDisksResource collection;
 
     public BackendSnapshotDiskResource(String diskId, 
BackendSnapshotDisksResource collection) {
-        super();
+        super(diskId, Disk.class, 
org.ovirt.engine.core.common.businessentities.Disk.class, null);
         this.diskId = diskId;
         this.collection = collection;
     }
@@ -26,4 +30,16 @@
         }
         throw new 
WebApplicationException(Response.status(Response.Status.NOT_FOUND).build());
     }
+
+    @Override
+    public Response exportAsBlockDevice(Action action) {
+        validateParameters(action.getHost(), "id");
+        ExportDiskBySnapshotAsBlockDeviceParameters params = new 
ExportDiskBySnapshotAsBlockDeviceParameters(Guid.createGuidFromString(diskId), 
collection.parent.guid, Guid.createGuidFromString(action.getHost().getId()));
+        return doAction(VdcActionType.ExportDiskBySnapshotAsBlockDevice, 
params, action);
+    }
+
+    @Override
+    protected Disk doPopulate(Disk model, 
org.ovirt.engine.core.common.businessentities.Disk entity) {
+        return model;
+    }
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDisksResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDisksResource.java
index 401690f..3f0f65c 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDisksResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotDisksResource.java
@@ -1,5 +1,8 @@
 package org.ovirt.engine.api.restapi.resource;
 
+import javax.ws.rs.core.Response;
+
+import org.ovirt.engine.api.model.Disk;
 import org.ovirt.engine.api.model.Disks;
 import org.ovirt.engine.api.resource.SnapshotDiskResource;
 import org.ovirt.engine.api.resource.SnapshotDisksResource;
@@ -7,10 +10,13 @@
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.VM;
 
-public class BackendSnapshotDisksResource extends 
BackendSnapshotElementsResource implements SnapshotDisksResource {
+public class BackendSnapshotDisksResource extends 
AbstractBackendCollectionResource<Disk, 
org.ovirt.engine.core.common.businessentities.Disk> implements 
SnapshotDisksResource {
 
-    public BackendSnapshotDisksResource(BackendSnapshotResource parent, String 
vmId) {
-        super(parent, vmId);
+    protected BackendSnapshotResource parent;
+
+    public BackendSnapshotDisksResource(BackendSnapshotResource parent) {
+        super(Disk.class, 
org.ovirt.engine.core.common.businessentities.Disk.class, null);
+        this.parent = parent;
     }
 
     @Override
@@ -27,6 +33,16 @@
 
     @Override
     public SnapshotDiskResource getDiskSubResource(String id) {
-        return new BackendSnapshotDiskResource(id, this);
+        return inject (new BackendSnapshotDiskResource(id, this));
+    }
+
+    @Override
+    protected Response performRemove(String id) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected Disk doPopulate(Disk model, 
org.ovirt.engine.core.common.businessentities.Disk entity) {
+        return model;
     }
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotResource.java
index ac6f9ff..e2e3f1e 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendSnapshotResource.java
@@ -120,7 +120,7 @@
     }
     @Override
     public SnapshotDisksResource getSnapshotDisksResource() {
-        return new BackendSnapshotDisksResource(this, id);
+        return inject(new BackendSnapshotDisksResource(this));
     }
     @Override
     public SnapshotNicsResource getSnapshotNicsResource() {
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceReturnForXmlRpc.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceReturnForXmlRpc.java
new file mode 100644
index 0000000..bb417652
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceReturnForXmlRpc.java
@@ -0,0 +1,27 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+import java.util.Map;
+
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturnForXmlRpc;
+
+public class ExportImageAsBlockDeviceReturnForXmlRpc extends 
StatusReturnForXmlRpc {
+
+    private Guid dmDeviceId;
+    private Map<String, Object> cbtInfo;
+
+    public ExportImageAsBlockDeviceReturnForXmlRpc(Map<String, Object> 
innerMap) {
+        super(innerMap);
+        dmDeviceId = Guid.createGuidFromString((String)innerMap.get("GUID"));
+        cbtInfo = (Map<String, Object>)innerMap.get("cbtInfo");
+
+    }
+
+    public Guid getDmDeviceId() {
+        return dmDeviceId;
+    }
+
+    public Map<String, Object> getCbtInfo() {
+        return cbtInfo;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceVDSCommand.java
new file mode 100644
index 0000000..e6b2b83
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceVDSCommand.java
@@ -0,0 +1,38 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+public class ExportImageAsBlockDeviceVDSCommand<P extends 
ExportImageAsBlockDeviceVDSCommandParameters> extends VdsBrokerCommand<P> {
+
+    ExportImageAsBlockDeviceReturnForXmlRpc response;
+
+    public ExportImageAsBlockDeviceVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void ExecuteVdsBrokerCommand() {
+        log.info("-- 
ExportImageAsBlockDeviceVDSCommand::ExecuteVdsBrokerCommand: calling 
'exportImageAsBlockDevice' ");
+        log.infoFormat("-- exportImageAsBlockDevice parameters:" + "\r\n"
+                + "                spUUID={0}" + "\r\n"
+                + "                sdUUID={1}" + "\r\n"
+                + "                imageGUID={2}" + "\r\n"
+                + "                volUUID={3}" + "\r\n",
+                getParameters().getStoragePoolId().toString(),
+                getParameters().getStorageDomainId().toString(),
+                getParameters().getImageGroupId().toString(),
+                getParameters().getImageId().toString());
+
+        response =
+                
getBroker().exportImageAsBlockDevice(getParameters().getStoragePoolId().toString(),
+                        getParameters().getStorageDomainId().toString(),
+                        getParameters().getImageGroupId().toString(),
+                        getParameters().getImageId().toString());
+        ProceedProxyReturnValue();
+
+        setReturnValue(response.getDmDeviceId());
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return response.mStatus;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceVDSCommandParameters.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceVDSCommandParameters.java
new file mode 100644
index 0000000..f272415
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExportImageAsBlockDeviceVDSCommandParameters.java
@@ -0,0 +1,48 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase;
+import org.ovirt.engine.core.compat.Guid;
+
+public class ExportImageAsBlockDeviceVDSCommandParameters extends 
VdsIdVDSCommandParametersBase {
+    private Guid storagePoolId, storageDomainId, imageGroupId, imageId;
+
+    public ExportImageAsBlockDeviceVDSCommandParameters(Guid vdsId, Guid 
storagePoolId, Guid storageDomainId, Guid imageGroupId, Guid imageId) {
+        super(vdsId);
+        this.storagePoolId = storagePoolId;
+        this.storageDomainId = storageDomainId;
+        this.imageGroupId = imageGroupId;
+        this.imageId = imageId;
+    }
+
+    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 Guid getImageGroupId() {
+        return imageGroupId;
+    }
+
+    public void setImageGroupId(Guid imageGroupId) {
+        this.imageGroupId = imageGroupId;
+    }
+
+    public Guid getImageId() {
+        return imageId;
+    }
+
+    public void setImageId(Guid imageId) {
+        this.imageId = imageId;
+    }
+}
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 e6c026f..1d38fa5 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
@@ -161,6 +161,8 @@
 
     StatusOnlyReturnForXmlRpc revertTask(String taskUUID);
 
+    ExportImageAsBlockDeviceReturnForXmlRpc exportImageAsBlockDevice(String 
spUUID, String sdUUID, String srcImgGUID, String srcVolUUID);
+
     StatusOnlyReturnForXmlRpc hotplugDisk(Map info);
 
     StatusOnlyReturnForXmlRpc hotunplugDisk(Map info);
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 0078042..949c12e 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
@@ -146,6 +146,8 @@
 
     public Map<String, Object> revertTask(String taskUUID);
 
+    Map<String, Object> exportImageAsBlockDevice(String spUUID, String sdUUID, 
String srcImgGUID, String srcVolUUID);
+
     Map<String, Object> hotplugDisk(Map<String, Object> info);
 
     Map<String, Object> hotunplugDisk(Map<String, Object> info);
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 70bffd2..cd433b0 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
@@ -787,6 +787,16 @@
 
     }
 
+    public ExportImageAsBlockDeviceReturnForXmlRpc 
exportImageAsBlockDevice(String spUUID, String sdUUID, String srcImgGUID, 
String srcVolUUID) {
+        try {
+            Map<String, Object> xmlRpcReturnValue = 
vdsServer.exportImageAsBlockDevice(spUUID, sdUUID, srcImgGUID, srcVolUUID);
+            ExportImageAsBlockDeviceReturnForXmlRpc wrapper = new 
ExportImageAsBlockDeviceReturnForXmlRpc(xmlRpcReturnValue);
+            return wrapper;
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
+    }
+
     @Override
     public StatusOnlyReturnForXmlRpc hotplugDisk(Map info) {
         try {
diff --git a/packaging/dbscripts/disk_images_sp.sql 
b/packaging/dbscripts/disk_images_sp.sql
index 3266cd7..2d94671 100644
--- a/packaging/dbscripts/disk_images_sp.sql
+++ b/packaging/dbscripts/disk_images_sp.sql
@@ -106,7 +106,7 @@
    AS $procedure$
 BEGIN
       RETURN QUERY SELECT *
-      FROM images_storage_domain_view images_storage_domain_view
+      FROM images_storage_domain_view
       WHERE vm_snapshot_id = v_vm_snapshot_id;
 END; $procedure$
 LANGUAGE plpgsql;
@@ -127,6 +127,20 @@
 
 
 
+Create or replace FUNCTION GetDiskSnapshotForVmSnapshot(v_image_group_id UUID, 
v_vm_snapshot_id UUID)
+RETURNS SETOF images_storage_domain_view
+   AS $procedure$
+BEGIN
+      RETURN QUERY SELECT *
+      FROM images_storage_domain_view images_storage_domain_view
+      WHERE image_group_id = v_image_group_id
+      AND vm_snapshot_id = v_vm_snapshot_id;
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+
+
 Create or replace FUNCTION GetImagesWhichHaveNoDisk(v_vm_id UUID)
 RETURNS SETOF images_storage_domain_view
    AS $procedure$
diff --git 
a/packaging/dbscripts/upgrade/03_03_0320_add_export_image_as_block_device_command.sql
 
b/packaging/dbscripts/upgrade/03_03_0320_add_export_image_as_block_device_command.sql
new file mode 100644
index 0000000..3ca0896
--- /dev/null
+++ 
b/packaging/dbscripts/upgrade/03_03_0320_add_export_image_as_block_device_command.sql
@@ -0,0 +1 @@
+insert into action_version_map values (1013, '3.3', '*');


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

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

Reply via email to