Daniel Erez has uploaded a new change for review. Change subject: restapi: support unregistered Cinder disks ......................................................................
restapi: support unregistered Cinder disks Support listing and registration of unregistered Cinder disks: * GET /api/storagedomains/{storage_domain_id}/disks;unregistered * POST /api/storagedomains/{storage_domain_id}/disks;unregistered Change-Id: Ia4cdf428535141caef382444aa634783044664ca Bug-Url: https://bugzilla.redhat.com/1185826 Signed-off-by: Daniel Erez <de...@redhat.com> --- M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResource.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResourceTest.java 3 files changed, 133 insertions(+), 55 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/64/40664/1 diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskResource.java index c3699f1..78a5914 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskResource.java @@ -3,6 +3,7 @@ import org.ovirt.engine.api.common.util.QueryHelper; import org.ovirt.engine.api.model.Disk; import org.ovirt.engine.api.model.StorageDomain; +import org.ovirt.engine.core.common.action.GetCinderEntityByStorageDomainIdParameters; import org.ovirt.engine.core.common.queries.GetUnregisteredDiskQueryParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; @@ -27,14 +28,19 @@ protected Disk performGet(VdcQueryType query, VdcQueryParametersBase params) { Disk disk; if (QueryHelper.hasMatrixParam(getUriInfo(), UNREGISTERED_CONSTRAINT_PARAMETER)) { - VdcQueryReturnValue result = runQuery(VdcQueryType.GetDiskByDiskId, new IdQueryParameters(guid)); - if (!result.getSucceeded() || result.getReturnValue() == null) { - Guid storageDomainGuid = asGuid(storageDomainId); - disk = super.performGet(VdcQueryType.GetUnregisteredDisk, new GetUnregisteredDiskQueryParameters(guid, storageDomainGuid, parent.getStoragePoolIdForDomain(storageDomainGuid))); + if (getStorageDomain().getStorageType().isCinderDomain()) { + disk = super.performGet(VdcQueryType.GetUnregisteredCinderDiskByIdAndStorageDomainId, + new GetCinderEntityByStorageDomainIdParameters(guid, parent.getStorageDomainId())); } else { - // The disk was found in the first get which means it is already registered. We must return nothing since the unregistered - // parameter was passed. - return notFound(); + VdcQueryReturnValue result = runQuery(VdcQueryType.GetDiskByDiskId, new IdQueryParameters(guid)); + if (!result.getSucceeded() || result.getReturnValue() == null) { + Guid storageDomainGuid = asGuid(storageDomainId); + disk = super.performGet(VdcQueryType.GetUnregisteredDisk, new GetUnregisteredDiskQueryParameters(guid, storageDomainGuid, parent.getStoragePoolIdForDomain(storageDomainGuid))); + } else { + // The disk was found in the first get which means it is already registered. We must return nothing since the unregistered + // parameter was passed. + return notFound(); + } } } else { disk = super.performGet(VdcQueryType.GetDiskByDiskId, new IdQueryParameters(guid)); @@ -49,6 +55,12 @@ return notFound(); } + protected org.ovirt.engine.core.common.businessentities.StorageDomain getStorageDomain() { + return getEntity(org.ovirt.engine.core.common.businessentities.StorageDomain.class, + VdcQueryType.GetStorageDomainById, new IdQueryParameters(parent.getStorageDomainId()), + storageDomainId.toString(), true); + } + @Override protected Disk deprecatedPopulate(Disk model, org.ovirt.engine.core.common.businessentities.storage.Disk entity) { Disk populatedDisk = super.doPopulate(model, entity); diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResource.java index 218fb88..8d353ce 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResource.java @@ -10,11 +10,14 @@ import org.ovirt.engine.api.model.StorageDomain; import org.ovirt.engine.api.resource.MovableCopyableDiskResource; import org.ovirt.engine.core.common.action.AddDiskParameters; +import org.ovirt.engine.core.common.action.RegisterCinderDiskParameters; import org.ovirt.engine.core.common.action.RegisterDiskParameters; import org.ovirt.engine.core.common.action.RemoveDiskParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StoragePool; +import org.ovirt.engine.core.common.businessentities.storage.CinderDisk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; +import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.queries.GetUnregisteredDiskQueryParameters; import org.ovirt.engine.core.common.queries.GetUnregisteredDisksQueryParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; @@ -38,6 +41,10 @@ @Override public Disks list() { if (QueryHelper.hasMatrixParam(getUriInfo(), UNREGISTERED_CONSTRAINT_PARAMETER)) { + if (getStorageDomain().getStorageType().isCinderDomain()) { + return mapCollection(getBackendCollection(VdcQueryType.GetUnregisteredCinderDisksByStorageDomainId, + new IdQueryParameters(storageDomainId))); + } return mapCollection(getBackendCollection(VdcQueryType.GetUnregisteredDisks, new GetUnregisteredDisksQueryParameters(storageDomainId, getStoragePoolIdForDomain(storageDomainId)))); @@ -47,21 +54,36 @@ } } + protected org.ovirt.engine.core.common.businessentities.StorageDomain getStorageDomain() { + return getEntity(org.ovirt.engine.core.common.businessentities.StorageDomain.class, + VdcQueryType.GetStorageDomainById, new IdQueryParameters(storageDomainId), + storageDomainId.toString(), true); + } + @Override public Response add(Disk disk) { if (QueryHelper.hasMatrixParam(getUriInfo(), UNREGISTERED_CONSTRAINT_PARAMETER)) { - // First we need to query the backend to fill in all the information about the disk from the VDSM. - // We don't just use the information from the Disk object because it's missing a few things like creation - // date and last modified date. - GetUnregisteredDiskQueryParameters getDiskParams = new GetUnregisteredDiskQueryParameters( - asGuid(disk.getId()), storageDomainId, getStoragePoolIdForDomain(storageDomainId)); - DiskImage unregisteredDisk = - getEntity(DiskImage.class, VdcQueryType.GetUnregisteredDisk, getDiskParams, disk.getId()); - unregisteredDisk = - (DiskImage) getMapper(Disk.class, org.ovirt.engine.core.common.businessentities.storage.Disk.class).map(disk, - unregisteredDisk); - RegisterDiskParameters registerDiskParams = new RegisterDiskParameters(unregisteredDisk, storageDomainId); - return performCreate(VdcActionType.RegisterDisk, registerDiskParams, ID_RESOLVER); + if (getStorageDomain().getStorageType().isCinderDomain()) { + disk.setStorageType(StorageType.CINDER.name()); + CinderDisk unregisteredDisk = (CinderDisk) getMapper( + Disk.class, org.ovirt.engine.core.common.businessentities.storage.Disk.class).map(disk, null); + RegisterCinderDiskParameters registerDiskParams = + new RegisterCinderDiskParameters(unregisteredDisk, storageDomainId); + return performCreate(VdcActionType.RegisterCinderDisk, registerDiskParams, ID_RESOLVER); + } else { + // First we need to query the backend to fill in all the information about the disk from the VDSM. + // We don't just use the information from the Disk object because it's missing a few things like creation + // date and last modified date. + GetUnregisteredDiskQueryParameters getDiskParams = new GetUnregisteredDiskQueryParameters( + asGuid(disk.getId()), storageDomainId, getStoragePoolIdForDomain(storageDomainId)); + DiskImage unregisteredDisk = + getEntity(DiskImage.class, VdcQueryType.GetUnregisteredDisk, getDiskParams, disk.getId()); + unregisteredDisk = + (DiskImage) getMapper(Disk.class, org.ovirt.engine.core.common.businessentities.storage.Disk.class).map(disk, + unregisteredDisk); + RegisterDiskParameters registerDiskParams = new RegisterDiskParameters(unregisteredDisk, storageDomainId); + return performCreate(VdcActionType.RegisterDisk, registerDiskParams, ID_RESOLVER); + } } else { validateDiskForCreation(disk); AddDiskParameters params = new AddDiskParameters(); diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResourceTest.java index 2a0040e..bb870bd 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDisksResourceTest.java @@ -19,10 +19,12 @@ import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.common.businessentities.StoragePool; +import org.ovirt.engine.core.common.businessentities.storage.CinderDisk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskInterface; import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; import org.ovirt.engine.core.common.businessentities.storage.PropagateErrors; +import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.common.interfaces.SearchType; @@ -73,14 +75,14 @@ setUpHttpHeaderExpectations("Expect", "201-created"); setUpEntityQueryExpectations(VdcQueryType.GetDiskByDiskId, IdQueryParameters.class, - new String[] { "Id" }, - new Object[] { GUIDS[0] }, + new String[]{"Id"}, + new Object[]{GUIDS[0]}, getEntity(0)); Disk model = getModel(0); setUpCreationExpectations(VdcActionType.AddDisk, AddDiskParameters.class, - new String[] {"StorageDomainId"}, - new Object[] {GUIDS[3]}, + new String[]{"StorageDomainId"}, + new Object[]{GUIDS[3]}, true, true, GUIDS[0], @@ -88,20 +90,25 @@ asList(new AsyncTaskStatus(AsyncTaskStatusEnum.finished)), VdcQueryType.GetDiskByDiskId, IdQueryParameters.class, - new String[] {"Id"}, - new Object[] {GUIDS[0]}, + new String[]{"Id"}, + new Object[]{GUIDS[0]}, getEntity(0)); Response response = collection.add(model); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof Disk); - verifyModel((Disk)response.getEntity(), 0); - assertNull(((Disk)response.getEntity()).getCreationStatus()); + verifyModel((Disk) response.getEntity(), 0); + assertNull(((Disk) response.getEntity()).getCreationStatus()); } @Test public void testAddUnregistered() throws Exception { setUriInfo(addMatrixParameterExpectations(setUpBasicUriExpectations(), BackendStorageDomainDisksResource.UNREGISTERED_CONSTRAINT_PARAMETER)); setUpHttpHeaderExpectations("Expect", "201-created"); + setUpEntityQueryExpectations(VdcQueryType.GetStorageDomainById, + IdQueryParameters.class, + new String[]{"Id"}, + new Object[]{GUIDS[3]}, + setUpStorageDomain(StorageType.NFS)); StoragePool storagePool = new StoragePool(); storagePool.setId(storagePoolId); setUpEntityQueryExpectations(VdcQueryType.GetStoragePoolsByStorageDomainId, @@ -120,15 +127,15 @@ // imageToRegister.setDiskAlias("alias"); setUpCreationExpectations(VdcActionType.RegisterDisk, RegisterDiskParameters.class, - new String[] { "DiskImage" }, - new Object[] { imageToRegister }, + new String[]{"DiskImage"}, + new Object[]{imageToRegister}, true, true, GUIDS[0], VdcQueryType.GetDiskByDiskId, IdQueryParameters.class, - new String[] {"Id"}, - new Object[] {GUIDS[0]}, + new String[]{"Id"}, + new Object[]{GUIDS[0]}, getEntity(0)); model.setId(GUIDS[0].toString()); Response response = collection.add(model); @@ -144,16 +151,16 @@ setUpHttpHeaderExpectations("Expect", "201-created"); setUpEntityQueryExpectations(VdcQueryType.GetDiskByDiskId, IdQueryParameters.class, - new String[] { "Id" }, - new Object[] { GUIDS[0] }, + new String[]{"Id"}, + new Object[]{GUIDS[0]}, getEntity(0)); Disk model = getModel(0); model.getStorageDomains().getStorageDomains().get(0).setId(null); model.getStorageDomains().getStorageDomains().get(0).setName("Storage_Domain_1"); setUpCreationExpectations(VdcActionType.AddDisk, AddDiskParameters.class, - new String[] {}, - new Object[] {}, + new String[]{}, + new Object[]{}, true, true, GUIDS[0], @@ -161,8 +168,8 @@ asList(new AsyncTaskStatus(AsyncTaskStatusEnum.finished)), VdcQueryType.GetDiskByDiskId, IdQueryParameters.class, - new String[] {"Id"}, - new Object[] {GUIDS[0]}, + new String[]{"Id"}, + new Object[]{GUIDS[0]}, getEntity(0)); Response response = collection.add(model); assertEquals(201, response.getStatus()); @@ -188,34 +195,54 @@ } setUpEntityQueryExpectations(VdcQueryType.GetAllDisksByStorageDomainId, IdQueryParameters.class, - new String[] { "Id" }, - new Object[] {GUIDS[3]}, + new String[]{"Id"}, + new Object[]{GUIDS[3]}, entities); control.replay(); verifyCollection(getCollection()); } @Test - public void testListUnregistered() throws Exception { + public void testListUnregisteredNfs() throws Exception { + testListUnregistered(StorageType.NFS); + } + + @Test + public void testListUnregisteredCinder() throws Exception { + testListUnregistered(StorageType.CINDER); + } + + private void testListUnregistered(StorageType storageType) throws Exception { setUriInfo(addMatrixParameterExpectations(setUpBasicUriExpectations(), BackendStorageDomainDisksResource.UNREGISTERED_CONSTRAINT_PARAMETER)); - - StoragePool storagePool = new StoragePool(); - storagePool.setId(storagePoolId); - setUpEntityQueryExpectations(VdcQueryType.GetStoragePoolsByStorageDomainId, - IdQueryParameters.class, - new String[] { "Id" }, - new Object[] {GUIDS[3]}, - Arrays.asList(storagePool)); - - List<org.ovirt.engine.core.common.businessentities.storage.Disk> entities = new ArrayList<org.ovirt.engine.core.common.businessentities.storage.Disk>(); + List<org.ovirt.engine.core.common.businessentities.storage.Disk> entities = new ArrayList<>(); for (int i = 0; i < NAMES.length; i++) { entities.add(getEntity(i)); } - setUpEntityQueryExpectations(VdcQueryType.GetUnregisteredDisks, - GetUnregisteredDisksQueryParameters.class, - new String[] {"StorageDomainId", "StoragePoolId"}, - new Object[] {GUIDS[3], storagePoolId}, - entities); + setUpEntityQueryExpectations(VdcQueryType.GetStorageDomainById, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { GUIDS[3] }, + setUpStorageDomain(storageType)); + if (storageType == StorageType.CINDER) { + setUpEntityQueryExpectations(VdcQueryType.GetUnregisteredCinderDisksByStorageDomainId, + IdQueryParameters.class, + new String[]{"Id"}, + new Object[]{GUIDS[3]}, + entities); + } else { + StoragePool storagePool = new StoragePool(); + storagePool.setId(storagePoolId); + setUpEntityQueryExpectations(VdcQueryType.GetStoragePoolsByStorageDomainId, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] {GUIDS[3]}, + Arrays.asList(storagePool)); + setUpEntityQueryExpectations(VdcQueryType.GetUnregisteredDisks, + GetUnregisteredDisksQueryParameters.class, + new String[] {"StorageDomainId", "StoragePoolId"}, + new Object[] {GUIDS[3], storagePoolId}, + entities); + } control.replay(); verifyCollection(getCollection()); } @@ -262,6 +289,23 @@ verifyLinks(model); } + protected org.ovirt.engine.core.common.businessentities.storage.CinderDisk getCinderDisk(int index) { + CinderDisk entity = new CinderDisk(); + entity.setId(GUIDS[index]); + entity.setDiskInterface(DiskInterface.VirtIO); + entity.setImageStatus(ImageStatus.OK); + entity.setBoot(false); + entity.setShareable(false); + return entity; + } + + public static org.ovirt.engine.core.common.businessentities.StorageDomain setUpStorageDomain(StorageType domainType) { + org.ovirt.engine.core.common.businessentities.StorageDomain entity = new org.ovirt.engine.core.common.businessentities.StorageDomain(); + entity.setId(GUIDS[3]); + entity.setStorageType(domainType); + return entity; + } + static void verifyModelSpecific(Disk model, int index) { assertEquals(GUIDS[index].toString(), model.getId()); assertFalse(model.isSetVm()); -- To view, visit https://gerrit.ovirt.org/40664 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia4cdf428535141caef382444aa634783044664ca Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <de...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches