Federico Simoncelli has uploaded a new change for review. Change subject: restapi: disk entity export to glance ......................................................................
restapi: disk entity export to glance Change-Id: If351d209d7828f0d59926bb98da9317567976d41 Signed-off-by: Federico Simoncelli <fsimo...@redhat.com> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskResource.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/BackendDiskResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDiskResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/DiskHelper.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskMapper.java 8 files changed, 119 insertions(+), 2 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/41/17541/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java index 6e18882..881f74c 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java @@ -4,7 +4,7 @@ public class ExportRepoImageParameters extends ImagesActionsParametersBase { - private static final long serialVersionUID = 8168949491104775480L; + private static final long serialVersionUID = 5665917269570010693L; private Guid destinationDomainId; diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskResource.java index a2372a3..b1ce93c 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskResource.java @@ -15,15 +15,24 @@ */ 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.PathParam; 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}) public interface DiskResource extends ReadOnlyResource<Disk>, MeasurableResource { + + @Path("{action: (export)}/{oid}") + public ActionResource getActionSubresource(@PathParam("action") String action, @PathParam("oid") String oid); @GET @Formatted @@ -32,4 +41,12 @@ @Path("permissions") public AssignedPermissionsResource getPermissionsResource(); + + @POST + @Formatted + @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) + @Actionable + @Path("export") + public Response doExport(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 eafd7dd..f1c37fd 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 @@ -490,6 +490,18 @@ Content-Type: {value: application/xml|json, required: true} Correlation-Id: {value: 'any string', required: false} Filter: {value: true|false, required: false} +- name: /api/vms/{vm:id}/disks/{disk:id}/export|rel=export + request: + body: + parameterType: Action + signatures: + - mandatoryArguments: {storagedomain.id|name: 'xs:string'} + optionalArguments: {} + urlparams: {} + headers: + Content-Type: {value: application/xml|json, required: true} + Correlation-Id: {value: 'any string', required: false} + Filter: {value: true|false, required: false} - name: /api/vms/{vm:id}/nics|rel=get request: body: @@ -851,6 +863,18 @@ signatures: [] urlparams: {} headers: {} +- name: /api/disks/{disk:id}/export|rel=export + request: + body: + parameterType: Action + signatures: + - mandatoryArguments: {storagedomain.id|name: 'xs:string'} + optionalArguments: {} + urlparams: {} + headers: + Content-Type: {value: application/xml|json, required: true} + Correlation-Id: {value: 'any string', required: false} + Filter: {value: true|false, required: false} - name: /api/capabilities|rel=get request: body: diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDiskResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDiskResource.java index dc47541..3b53a65 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDiskResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDiskResource.java @@ -1,17 +1,25 @@ package org.ovirt.engine.api.restapi.resource; +import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.Disk; +import org.ovirt.engine.api.resource.ActionResource; import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.CreationResource; import org.ovirt.engine.api.resource.DiskResource; import org.ovirt.engine.api.resource.StatisticsResource; +import org.ovirt.engine.api.restapi.util.DiskHelper; import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.ExportRepoImageParameters; +import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; -public class BackendDiskResource extends AbstractBackendSubResource<Disk, org.ovirt.engine.core.common.businessentities.Disk> implements DiskResource { +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Response; + +public class BackendDiskResource extends AbstractBackendActionableResource<Disk, org.ovirt.engine.core.common.businessentities.Disk> implements DiskResource { protected BackendDiskResource(String id) { super(id, Disk.class, org.ovirt.engine.core.common.businessentities.Disk.class); @@ -39,6 +47,23 @@ } @Override + public Response doExport(Action action) { + validateParameters(action, "storageDomain.id|name"); + try { + ExportRepoImageParameters exportParameters = + DiskHelper.getExportRepoImageParameters(get(), getStorageDomainId(action)); + return doAction(VdcActionType.ExportRepoImage, exportParameters, action); + } catch (Exception e) { + return handleError(e, action); + } + } + + @Override + public ActionResource getActionSubresource(@PathParam("action") String action, @PathParam("oid") String oid) { + return inject(new BackendActionResource(action, oid)); + } + + @Override public Disk get() { return performGet(VdcQueryType.GetDiskByDiskId, new IdQueryParameters(guid)); } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java index 2325622..f3e0937 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java @@ -65,6 +65,7 @@ @Override public Image get() { + // return super.get();//explicit call solves REST-Easy confusion return performGet(VdcQueryType.GetImageById, new GetImageByIdParameters(getStorageDomainId(), id)); } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDiskResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDiskResource.java index a73daad..628b6fa 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDiskResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDiskResource.java @@ -13,7 +13,9 @@ import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.StatisticsResource; import org.ovirt.engine.api.resource.VmDiskResource; +import org.ovirt.engine.api.restapi.util.DiskHelper; import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.ExportRepoImageParameters; import org.ovirt.engine.core.common.action.HotPlugDiskToVmParameters; import org.ovirt.engine.core.common.action.MoveDiskParameters; import org.ovirt.engine.core.common.action.MoveDisksParameters; @@ -118,6 +120,18 @@ } @Override + public Response doExport(Action action) { + validateParameters(action, "storageDomain.id|name"); + try { + ExportRepoImageParameters exportParameters = + DiskHelper.getExportRepoImageParameters(getDisk(), getStorageDomainId(action)); + return doAction(VdcActionType.ExportRepoImage, exportParameters, action); + } catch (Exception e) { + return handleError(e, action); + } + } + + @Override public Disk update(Disk resource) { validateEnums(Disk.class, resource); return super.update(resource);//explicit call solves REST-Easy confusion diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/DiskHelper.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/DiskHelper.java new file mode 100644 index 0000000..c6a8b0b --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/DiskHelper.java @@ -0,0 +1,29 @@ +package org.ovirt.engine.api.restapi.util; + +import org.ovirt.engine.api.model.Disk; +import org.ovirt.engine.api.model.StorageDomain; +import org.ovirt.engine.core.common.action.ExportRepoImageParameters; +import org.ovirt.engine.core.compat.Guid; + +public class DiskHelper { + public static ExportRepoImageParameters getExportRepoImageParameters(Disk disk, Guid destinationStorageDomainId) { + if (disk.isSetLunStorage()) { + throw new UnsupportedOperationException("Direct LUN disks are unsupported"); + } + + if (disk.getStorageDomains() == null || disk.getStorageDomains().getStorageDomains().size() < 1) { + throw new IllegalStateException("Cannot find disk storage domain"); + } + + ExportRepoImageParameters exportParameters = new ExportRepoImageParameters(new Guid(disk.getImageId())); + StorageDomain storageDomain = disk.getStorageDomains().getStorageDomains().get(0); + + exportParameters.setStoragePoolId(new Guid(storageDomain.getDataCenter().getId())); + exportParameters.setStorageDomainId(new Guid(storageDomain.getId())); + exportParameters.setImageGroupID(new Guid(disk.getId())); + + exportParameters.setDestinationDomainId(destinationStorageDomainId); + + return exportParameters; + } +} diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskMapper.java index 4f7fc34..4823cda 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskMapper.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import org.ovirt.engine.api.common.util.StatusUtils; +import org.ovirt.engine.api.model.DataCenter; import org.ovirt.engine.api.model.Disk; import org.ovirt.engine.api.model.DiskFormat; import org.ovirt.engine.api.model.DiskInterface; @@ -172,9 +173,15 @@ if (!model.isSetStorageDomains()) { model.setStorageDomains(new StorageDomains()); } + DataCenter dataCenter = null; + if (entity.getStoragePoolId() != null) { + dataCenter = new DataCenter(); + dataCenter.setId(entity.getStoragePoolId().toString()); + } for (Guid id : entity.getStorageIds()){ StorageDomain storageDomain = new StorageDomain(); storageDomain.setId(id.toString()); + storageDomain.setDataCenter(dataCenter); model.getStorageDomains().getStorageDomains().add(storageDomain); } } -- To view, visit http://gerrit.ovirt.org/17541 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If351d209d7828f0d59926bb98da9317567976d41 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Federico Simoncelli <fsimo...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches