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
