Chris Morrissey has uploaded a new change for review.

Change subject: restapi: Added "scan" to disks resource to import clones
......................................................................

restapi: Added "scan" to disks resource to import clones

I am working on a plugin for NetApp storage systems that will
use its cloning capabilities to clone disks outside of oVirt.
This new API will allow us to have those disks imported into
oVirt so that we can attach them to copies of the original VM.

This change set adds a new VDS command, GetVolumesList that
already existed in the VDSM API but was not exposed in oVirt.

The functionality to scan for new disk images uses a new ScanDomain
query that was previously submitted. This returns the list of
unregistered images. The GetVolumesList and GetImageInfo VDS
commands are used to populate the disk images that are then added
to the oVirt DB through the new ImportImageCommand.

There are some assumptions made in that images that contain
snapshots will not be imported as we don't have the associated
snapshot metadata. Also, this is only supported on NFS storage
domains.

When querying to find the storage pool associated with the
storage domain, I found that it returned a list of storage
pools. I am assuming that an NFS based storage domain would
only belong to a single storage pool and thus I took the first
item in the list. If this assumption is unfounded please note
in the review.

Change-Id: If6236e563d38ee1a793bd94ff60587f19b3010d1
Signed-off-by: Chris Morrissey <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportImageCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ScanDomainQuery.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImportImageParameters.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/queries/VdcQueryType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImagesListVDSCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
M 
backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DisksResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImagesListVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetVolumesListVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ImagesListReturnForXmlRpc.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/UUIDListReturnForXmlRpc.java
19 files changed, 459 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/03/9603/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportImageCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportImageCommand.java
new file mode 100644
index 0000000..4c7cfe2
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportImageCommand.java
@@ -0,0 +1,45 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.common.action.ImportImageParameters;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.VdcBllMessages;
+import org.ovirt.engine.core.utils.transaction.TransactionMethod;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
+
+@InternalCommandAttribute
+@NonTransactiveCommandAttribute(forceCompensation=true)
+public class ImportImageCommand <T extends ImportImageParameters> extends 
BaseImagesCommand<T> {
+
+    private static final long serialVersionUID = -1201881996330878181L;
+
+    public ImportImageCommand(T parameters) {
+        super(parameters);
+    }
+
+    protected ImportImageCommand(Guid commandId) {
+        super(commandId);
+    }
+
+    @Override
+    protected void executeCommand() {
+        final DiskImage newDiskImage = getParameters().getDiskImage();
+        if (newDiskImage != null) {
+            TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+                @Override
+                public Void runInTransaction() {
+                    addDiskImageToDb(newDiskImage, getCompensationContext());
+                    
getReturnValue().setActionReturnValue(newDiskImage.getId());
+                    getReturnValue().setSucceeded(true);
+                    return null;
+                }
+            });
+        }
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__IMPORT);
+        addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM_DISK);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ScanDomainQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ScanDomainQuery.java
new file mode 100644
index 0000000..2a6a144
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ScanDomainQuery.java
@@ -0,0 +1,58 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend;
+import org.ovirt.engine.core.common.queries.StorageDomainQueryParametersBase;
+import 
org.ovirt.engine.core.common.vdscommands.GetImagesListVDSCommandParameters;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.utils.log.Log;
+import org.ovirt.engine.core.utils.log.LogFactory;
+
+/**
+ * A query which scans the storage domain for disk images not currently 
recognized by oVirt,
+ * and then returns them in a List (ArrayList<Guid>)
+ *
+ * @author Ricky Hopper
+ *
+ * @param <P>
+ */
+public class ScanDomainQuery<P extends StorageDomainQueryParametersBase> 
extends QueriesCommandBase<P> {
+
+    private static final Log logger = LogFactory.getLog(ScanDomainQuery.class);
+
+    public ScanDomainQuery(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        // first, run getImagesList query into vdsm to get all of the images 
on the storage domain - then store in imagesList
+        VDSBrokerFrontend vdsBroker = getBackend().getResourceManager();
+        VDSReturnValue imagesListResult = 
vdsBroker.RunVdsCommand(VDSCommandType.GetImagesList, new 
GetImagesListVDSCommandParameters(getParameters().getStorageDomainId(), 
DbFacade.getInstance()
+                        .getStoragePoolDao()
+                        .getAllForStorageDomain(
+                                
getParameters().getStorageDomainId()).get(0).getId()));
+        List<Guid> imagesList = (List<Guid>) imagesListResult.getReturnValue();
+        //fromDao is a list of all disk images on the domain from the DAO
+        List<DiskImage> fromDao = 
getDbFacade().getDiskImageDao().getAllSnapshotsForStorageDomain(getParameters().getStorageDomainId());
+        // then, compare the list of all images on the domain with the list 
oVirt recognizes
+        // if the ID in imagesList is recognized by oVirt, remove from list
+        for (DiskImage image : fromDao) {
+            imagesList.remove(image.getId());
+        }
+        // log the difference [for testing purposes]
+        if (imagesList.isEmpty()) {
+            logger.info("List is empty.");
+        } else {
+            logger.info("UUIDs found: " + StringUtils.join(imagesList, ","));
+        }
+        getQueryReturnValue().setReturnValue(imagesList); // return difference
+    }
+
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImportImageParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImportImageParameters.java
new file mode 100644
index 0000000..bc59116
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImportImageParameters.java
@@ -0,0 +1,30 @@
+package org.ovirt.engine.core.common.action;
+
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.compat.Guid;
+
+public class ImportImageParameters extends ImagesActionsParametersBase {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -2354567059991414220L;
+
+    private DiskImage diskImage;
+
+    public ImportImageParameters() {
+    }
+
+    public ImportImageParameters(Guid imageId, DiskImage diskImage) {
+        super(Guid.Empty);
+        this.diskImage = diskImage;
+    }
+
+    public DiskImage getDiskImage() {
+        return diskImage;
+    }
+
+    public void setDiskImage(DiskImage diskImage) {
+        this.diskImage = diskImage;
+    }
+}
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 37e1d37..188d952 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
@@ -107,6 +107,7 @@
     RemoveImage(211, QuotaDependency.STORAGE),
     RemoveAllVmImages(212, QuotaDependency.STORAGE),
     AddImageFromScratch(213, QuotaDependency.STORAGE),
+    ImportImage(214, ActionGroup.CONFIGURE_VM_STORAGE, 
QuotaDependency.STORAGE),
     RemoveTemplateSnapshot(215, QuotaDependency.STORAGE),
     RemoveAllVmTemplateImageTemplates(216, QuotaDependency.STORAGE),
     TryBackToAllSnapshotsOfVm(223, ActionGroup.MANIPULATE_VM_SNAPSHOTS, 
QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index f75e134..688bb71 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -93,6 +93,7 @@
     GetAllDisksByVmId(VdcQueryAuthType.User),
     GetAllAttachableDisks(VdcQueryAuthType.User),
     GetAllDisks,
+    ScanDomain,
     GetImageByImageId,
     GetDiskByDiskId,
     GetImagesByStorageDomainAndTemplate,
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImagesListVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImagesListVDSCommandParameters.java
new file mode 100644
index 0000000..5558fba
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImagesListVDSCommandParameters.java
@@ -0,0 +1,33 @@
+package org.ovirt.engine.core.common.vdscommands;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class GetImagesListVDSCommandParameters extends 
IrsBaseVDSCommandParameters {
+    public GetImagesListVDSCommandParameters(Guid sdUUID) {
+        super();
+        setStorageDomainId(sdUUID);
+    }
+
+    public GetImagesListVDSCommandParameters(Guid sdUUID, Guid spUUID) {
+        super(spUUID);
+        setStorageDomainId(sdUUID);
+    }
+
+    private Guid storageDomainId = new Guid();
+
+    public Guid getStorageDomainId() {
+        return storageDomainId;
+    }
+
+    private void setStorageDomainId(Guid value) {
+        storageDomainId = value;
+    }
+
+    public GetImagesListVDSCommandParameters() {
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s, sdUUID = %s", super.toString(), 
getStorageDomainId());
+    }
+}
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 92ddbf4..8ec5f0e 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
@@ -97,6 +97,7 @@
     VmReplicateDiskStart("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     VmReplicateDiskFinish("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     GetImageDomainsList("org.ovirt.engine.core.vdsbroker.irsbroker"),
+    GetImagesList("org.ovirt.engine.core.vdsbroker.irsbroker"),
     CreateVG("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     RemoveVG("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     GetVGList("org.ovirt.engine.core.vdsbroker.vdsbroker"),
@@ -104,6 +105,7 @@
     GetDeviceList("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     GetDeviceInfo("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     GetDevicesVisibility("org.ovirt.engine.core.vdsbroker.vdsbroker"),
+    GetVolumesList("org.ovirt.engine.core.vdsbroker.irsbroker"),
     SPMGetAllTasksStatuses("org.ovirt.engine.core.vdsbroker.irsbroker"),
     SPMGetTaskStatus("org.ovirt.engine.core.vdsbroker.irsbroker"),
     SPMGetAllTasksInfo("org.ovirt.engine.core.vdsbroker.irsbroker"),
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties
 
b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties
index 2b6c92d..baf9e42 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties
@@ -84,6 +84,7 @@
 job.ReplaceGlusterVolumeBrick=Replacing Brick in Gluster Volume 
${GlusterVolume}
 job.AddBricksToGlusterVolume=Adding Bricks to Gluster Volume ${GlusterVolume}
 job.RemoveGlusterServer=Removing Gluster Server ${VDS}
+job.ImportImage=Importing Image ${DiskAlias}
 
 # Step types
 step.VALIDATING=Validating
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DisksResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DisksResource.java
index 1131369..f1daddc 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DisksResource.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DisksResource.java
@@ -29,4 +29,12 @@
     @Path("{id}")
     public Response remove(@PathParam("id") String id);
 
+    /**
+     * Scans the specified domain for disk images that have not been 
registered with the oVirt DB. This allows an outside entity to clone disk
+     * images and then use this command to look for them and have them 
registered in the oVirt DB and be accessible for attaching to VMs.
+     * This is intended to be used with NFS storage domains and will only 
register disk images that have no snapshots.
+     */
+    @Path("scan/{domainId}")
+    @POST
+    public Disks scanForDiskImages(@PathParam("domainId") String domainId);
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java
index 612bb6d..ee17d37 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java
@@ -14,13 +14,24 @@
 import 
org.ovirt.engine.api.restapi.resource.BaseBackendResource.WebFaultException;
 import org.ovirt.engine.api.restapi.resource.utils.DiskResourceUtils;
 import org.ovirt.engine.core.common.action.AddDiskParameters;
+import org.ovirt.engine.core.common.action.ImportImageParameters;
 import org.ovirt.engine.core.common.action.RemoveDiskParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.DiskInterface;
 import org.ovirt.engine.core.common.businessentities.storage_domains;
+import org.ovirt.engine.core.common.businessentities.storage_pool;
 import org.ovirt.engine.core.common.interfaces.SearchType;
+import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend;
 import org.ovirt.engine.core.common.queries.GetDiskByDiskIdParameters;
+import org.ovirt.engine.core.common.queries.StorageDomainQueryParametersBase;
 import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
+import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
+import 
org.ovirt.engine.core.common.vdscommands.GetImageInfoVDSCommandParameters;
+import 
org.ovirt.engine.core.common.vdscommands.StoragePoolDomainAndGroupIdBaseVDSCommandParameters;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
 
 public class BackendDisksResource extends 
AbstractBackendCollectionResource<Disk, 
org.ovirt.engine.core.common.businessentities.Disk> implements DisksResource{
@@ -104,4 +115,84 @@
         }
         return collection;
     }
+
+    @Override
+    public Disks scanForDiskImages(String domainId) {
+        // Create the disks resource that will be used to store any disks we 
find while scanning the domain.
+        Disks disksResource = new Disks();
+        Guid domainGuid = asGuid(domainId);
+
+        // Retrieve the storage pools for the storage domain. This is needed 
when getting the list of volumes in the
+        // unregistered images we find in the domain.
+        @SuppressWarnings("unchecked")
+        List<storage_pool> storagePools =
+                getEntity(List.class,
+                        VdcQueryType.GetStoragePoolsByStorageDomainId,
+                        new StorageDomainQueryParametersBase(domainGuid),
+                        domainId);
+        if (storagePools != null && !storagePools.isEmpty()) {
+            // Take the first storage pool. We should only be running on NFS 
domains and thus should only have a single
+            // storage pool to deal with.
+            Guid storagePoolId = storagePools.get(0).getId();
+
+            // Scan the domain and get a list of unregistered images.
+            StorageDomainQueryParametersBase scanQueryParameters = new 
StorageDomainQueryParametersBase(domainGuid);
+            VdcQueryReturnValue newImagesReturn = 
runQuery(VdcQueryType.ScanDomain, scanQueryParameters);
+            if (newImagesReturn.getSucceeded()) {
+
+                // Get a reference to the VDS broker so we can run commands 
against the backend.
+                VDSBrokerFrontend vdsBroker = 
getBackend().getResourceManager();
+                @SuppressWarnings("unchecked")
+                List<Guid> newImages = (List<Guid>) 
newImagesReturn.getReturnValue();
+                for (Guid newImage : newImages) {
+
+                    // Now get the list of volumes for each new image.
+                    StoragePoolDomainAndGroupIdBaseVDSCommandParameters 
getVolumesParameters =
+                            new 
StoragePoolDomainAndGroupIdBaseVDSCommandParameters(storagePoolId, domainGuid, 
newImage);
+                    VDSReturnValue volumesListReturn =
+                            
vdsBroker.RunVdsCommand(VDSCommandType.GetVolumesList, getVolumesParameters);
+                    if (volumesListReturn.getSucceeded()) {
+                        @SuppressWarnings("unchecked")
+                        List<Guid> volumesList = (List<Guid>) 
volumesListReturn.getReturnValue();
+
+                        // We can't deal with snapshots, so there should only 
be a single volume associated with the
+                        // image. If there are multiple volumes, skip the 
image and
+                        // move on to the next.
+                        if (volumesList.size() == 1) {
+                            Guid volumeId = volumesList.get(0);
+
+                            // Get the information about the volume from VDSM.
+                            GetImageInfoVDSCommandParameters 
imageInfoParameters =
+                                    new 
GetImageInfoVDSCommandParameters(storagePoolId, domainGuid, newImage, volumeId);
+                            VDSReturnValue imageInfoReturn =
+                                    
vdsBroker.RunVdsCommand(VDSCommandType.GetImageInfo, imageInfoParameters);
+
+                            if (imageInfoReturn.getSucceeded()) {
+                                DiskImage newDiskImage = (DiskImage) 
imageInfoReturn.getReturnValue();
+                                // The disk image won't have an interface set 
on it. Set it to IDE by default. When the
+                                // disk is attached to a VM, its interface can 
be changed to the
+                                // appropriate value for that VM.
+                                
newDiskImage.setDiskInterface(DiskInterface.IDE);
+
+                                // Register the image in the oVirt DB.
+                                ImportImageParameters registerImageParameters =
+                                        new ImportImageParameters(volumeId, 
newDiskImage);
+                                Response creationResponse =
+                                        
performCreation(VdcActionType.ImportImage, registerImageParameters,
+                                                new 
QueryIdResolver(VdcQueryType.GetDiskByDiskId,
+                                                        
GetDiskByDiskIdParameters.class));
+                                Object creation = creationResponse.getEntity();
+
+                                // Add the new disk to the disks we are 
returning.
+                                if (creation != null && creation instanceof 
Disk) {
+                                    disksResource.getDisks().add((Disk) 
creation);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return disksResource;
+    }
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
index cb5e773..3985d57 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
@@ -1,5 +1,7 @@
 package org.ovirt.engine.api.restapi.resource;
 
+import static 
org.ovirt.engine.api.restapi.resource.BackendStorageDomainsResource.SUB_COLLECTIONS;
+
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
@@ -18,6 +20,7 @@
 import org.ovirt.engine.api.resource.RemovableStorageDomainContentsResource;
 import org.ovirt.engine.api.resource.FilesResource;
 import org.ovirt.engine.api.resource.StorageDomainResource;
+import org.ovirt.engine.api.restapi.util.StorageDomainHelper;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.ExtendSANStorageDomainParameters;
 import org.ovirt.engine.core.common.action.StorageDomainManagementParameter;
@@ -25,9 +28,10 @@
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus;
+import org.ovirt.engine.core.common.businessentities.StorageType;
 import org.ovirt.engine.core.common.businessentities.VDS;
-import org.ovirt.engine.core.common.businessentities.storage_domains;
 import org.ovirt.engine.core.common.businessentities.storage_domain_static;
+import org.ovirt.engine.core.common.businessentities.storage_domains;
 import 
org.ovirt.engine.core.common.businessentities.storage_server_connections;
 import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.queries.GetDeviceListQueryParameters;
@@ -35,10 +39,6 @@
 import org.ovirt.engine.core.common.queries.StorageDomainQueryParametersBase;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.core.compat.Guid;
-import org.ovirt.engine.core.common.businessentities.StorageType;
-import org.ovirt.engine.api.restapi.util.StorageDomainHelper;
-
-import static 
org.ovirt.engine.api.restapi.resource.BackendStorageDomainsResource.SUB_COLLECTIONS;
 
 public class BackendStorageDomainResource extends
         AbstractBackendSubResource<StorageDomain, storage_domains> implements 
StorageDomainResource {
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java
index 3e2ebbc..c5645aa 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java
@@ -6,6 +6,8 @@
 
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.ImageStatus;
+import org.ovirt.engine.core.common.businessentities.VolumeFormat;
+import org.ovirt.engine.core.common.businessentities.VolumeType;
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.common.utils.EnumUtils;
 import 
org.ovirt.engine.core.common.vdscommands.GetImageInfoVDSCommandParameters;
@@ -109,6 +111,12 @@
             if (xmlRpcStruct.contains("image")) {
                 newImage.setimage_group_id(new 
Guid(xmlRpcStruct.getItem("image").toString()));
             }
+            if (xmlRpcStruct.contains("type")) {
+                newImage.setvolume_type(EnumUtils.valueOf(VolumeType.class, 
xmlRpcStruct.getItem("type").toString(), true));
+            }
+            if (xmlRpcStruct.contains("format")) {
+                
newImage.setvolume_format(EnumUtils.valueOf(VolumeFormat.class, 
xmlRpcStruct.getItem("format").toString(), true));
+            }
         } catch (RuntimeException ex) {
             log.errorFormat("irsBroker::buildImageEntity::Failed building 
DIskImage");
             PrintReturnValue();
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImagesListVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImagesListVDSCommand.java
new file mode 100644
index 0000000..805053b
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImagesListVDSCommand.java
@@ -0,0 +1,53 @@
+package org.ovirt.engine.core.vdsbroker.irsbroker;
+
+import java.util.ArrayList;
+
+import org.ovirt.engine.core.common.errors.VDSError;
+import org.ovirt.engine.core.common.errors.VdcBllErrors;
+import 
org.ovirt.engine.core.common.vdscommands.GetImagesListVDSCommandParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc;
+
+public class GetImagesListVDSCommand<P extends 
GetImagesListVDSCommandParameters>
+        extends IrsBrokerCommand<P> {
+    private ImagesListReturnForXmlRpc _result;
+
+    public GetImagesListVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void ExecuteIrsBrokerCommand() {
+        _result = 
getIrsProxy().getImagesList(getParameters().getStorageDomainId().toString());
+        ProceedProxyReturnValue();
+        ArrayList<Guid> tempRetValue = new 
ArrayList<Guid>(_result.getImageList().length);
+        for (String id : _result.getImageList()) {
+            tempRetValue.add(new Guid(id));
+        }
+        setReturnValue(tempRetValue);
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return _result.mStatus;
+    }
+
+    @Override
+    protected Object getReturnValueFromBroker() {
+        return _result;
+    }
+
+    @Override
+    protected void ProceedProxyReturnValue() {
+        VdcBllErrors returnStatus = 
GetReturnValueFromStatus(getReturnStatus());
+        switch (returnStatus) {
+        case GetStorageDomainListError:
+            getVDSReturnValue().setVdsError(new VDSError(returnStatus, 
getReturnStatus().mMessage));
+            getVDSReturnValue().setSucceeded(false);
+            break;
+        default:
+            super.ProceedProxyReturnValue();
+            break;
+        }
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetVolumesListVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetVolumesListVDSCommand.java
new file mode 100644
index 0000000..cb6830e
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetVolumesListVDSCommand.java
@@ -0,0 +1,56 @@
+package org.ovirt.engine.core.vdsbroker.irsbroker;
+
+import java.util.ArrayList;
+
+import org.ovirt.engine.core.common.errors.VDSError;
+import org.ovirt.engine.core.common.errors.VdcBllErrors;
+import 
org.ovirt.engine.core.common.vdscommands.StoragePoolDomainAndGroupIdBaseVDSCommandParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc;
+
+public class GetVolumesListVDSCommand<P extends 
StoragePoolDomainAndGroupIdBaseVDSCommandParameters> extends 
IrsBrokerCommand<P> {
+    private UUIDListReturnForXmlRpc _result;
+
+    public GetVolumesListVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void ExecuteIrsBrokerCommand() {
+        _result =
+                
getIrsProxy().getVolumesList(getParameters().getStorageDomainId().toString(),
+                        getParameters().getStoragePoolId().toString(),
+                        getParameters().getImageGroupId().toString());
+        ProceedProxyReturnValue();
+        ArrayList<Guid> tempRetValue = new 
ArrayList<Guid>(_result.getUUIDList().length);
+        for (String id : _result.getUUIDList()) {
+            tempRetValue.add(new Guid(id));
+        }
+        setReturnValue(tempRetValue);
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return _result.mStatus;
+    }
+
+    @Override
+    protected Object getReturnValueFromBroker() {
+        return _result;
+    }
+
+    @Override
+    protected void ProceedProxyReturnValue() {
+        VdcBllErrors returnStatus = 
GetReturnValueFromStatus(getReturnStatus());
+        switch (returnStatus) {
+        case GetStorageDomainListError:
+            getVDSReturnValue().setVdsError(new VDSError(returnStatus, 
getReturnStatus().mMessage));
+            getVDSReturnValue().setSucceeded(false);
+            break;
+        default:
+            super.ProceedProxyReturnValue();
+            break;
+        }
+    }
+
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
index 5fff8aa..011cac3 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
@@ -91,4 +91,8 @@
     GetVmsListReturnForXmlRpc getVmsList(String storagePoolId, String 
storageDomainId);
 
     StatusOnlyReturnForXmlRpc upgradeStoragePool(String storagePoolId, String 
targetVersion);
+
+    ImagesListReturnForXmlRpc getImagesList(String sdUUID);
+
+    UUIDListReturnForXmlRpc getVolumesList(String sdUUID, String spUUID, 
String imgUUID);
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ImagesListReturnForXmlRpc.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ImagesListReturnForXmlRpc.java
new file mode 100644
index 0000000..69dfdb5
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ImagesListReturnForXmlRpc.java
@@ -0,0 +1,23 @@
+package org.ovirt.engine.core.vdsbroker.irsbroker;
+
+import java.util.Map;
+
+public final class ImagesListReturnForXmlRpc extends StatusReturnForXmlRpc {
+    private static final String IMAGES_LIST = "imageslist";
+    private String[] mImageList;
+
+    public ImagesListReturnForXmlRpc(Map<String, Object> innerMap) {
+        super(innerMap);
+        Object[] tempObj = (Object[]) innerMap.get(IMAGES_LIST);
+        if (tempObj != null) {
+            mImageList = new String[tempObj.length];
+            for (int i = 0; i < tempObj.length; i++) {
+                mImageList[i] = (String) tempObj[i];
+            }
+        }
+    }
+
+    public String[] getImageList() {
+        return mImageList;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
index 506ef9b..974d641 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
@@ -104,4 +104,7 @@
 
     public Map<String, Object> upgradeStoragePool(String storagePoolId, String 
targetVersion);
 
+    public Map<String, Object> getImagesList(String sdUUID);
+
+    public Map<String, Object> getVolumesList(String sdUUID, String spUUID, 
String imgUUID);
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
index 0ff238e..e322121 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
@@ -265,4 +265,18 @@
         Map<String, Object> xmlRpcReturnValue = 
irsServer.upgradeStoragePool(storagePoolId, targetVersion);
         return new StatusOnlyReturnForXmlRpc(xmlRpcReturnValue);
     }
+
+    @Override
+    public ImagesListReturnForXmlRpc getImagesList(String sdUUID) {
+        Map<String, Object> xmlRpcReturnValue = 
irsServer.getImagesList(sdUUID);
+        ImagesListReturnForXmlRpc wrapper = new 
ImagesListReturnForXmlRpc(xmlRpcReturnValue);
+        return wrapper;
+    }
+
+    @Override
+    public UUIDListReturnForXmlRpc getVolumesList(String sdUUID, String 
spUUID, String imgUUID) {
+        Map<String, Object> xmlRpcReturnValue = 
irsServer.getVolumesList(sdUUID, spUUID, imgUUID);
+        UUIDListReturnForXmlRpc wrapper = new 
UUIDListReturnForXmlRpc(xmlRpcReturnValue);
+        return wrapper;
+    }
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/UUIDListReturnForXmlRpc.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/UUIDListReturnForXmlRpc.java
new file mode 100644
index 0000000..fbc50c2
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/UUIDListReturnForXmlRpc.java
@@ -0,0 +1,23 @@
+package org.ovirt.engine.core.vdsbroker.irsbroker;
+
+import java.util.Map;
+
+public class UUIDListReturnForXmlRpc extends StatusReturnForXmlRpc {
+    private static final String UUID_LIST = "uuidlist";
+    private String[] mUUIDList;
+
+    public UUIDListReturnForXmlRpc(Map<String, Object> innerMap) {
+        super(innerMap);
+        Object[] tempObj = (Object[]) innerMap.get(UUID_LIST);
+        if (tempObj != null) {
+            mUUIDList = new String[tempObj.length];
+            for (int i = 0; i < tempObj.length; i++) {
+                mUUIDList[i] = (String) tempObj[i];
+            }
+        }
+    }
+
+    public String[] getUUIDList() {
+        return mUUIDList;
+    }
+}


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

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

Reply via email to