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

Reply via email to