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
