package org.ovirt.engine.core.bll.storage.disk.image; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.ovirt.engine.core.bll.QueriesCommandBase; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.queries.GetUnregisteredDiskQueryParameters; import org.ovirt.engine.core.common.queries.GetUnregisteredDisksQueryParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; 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.dao.DiskImageDao; import org.ovirt.engine.core.dao.StorageDomainDao; public class GetUnregisteredDisksQuery<P extends GetUnregisteredDisksQueryParameters> extends QueriesCommandBase<P> { @Inject private StorageDomainDao storageDomainDao; @Inject private DiskImageDao diskImageDao; public GetUnregisteredDisksQuery(P parameters) { super(parameters); } @Override protected void executeQueryCommand() { StorageDomain storageDomain = storageDomainDao.get(getStorageDomainId()); if (storageDomain == null) { getQueryReturnValue().setExceptionString(EngineMessage.STORAGE_DOMAIN_DOES_NOT_EXIST.toString()); getQueryReturnValue().setSucceeded(false); return; } if (storageDomain.getStorageType().isCinderDomain()) { VdcQueryReturnValue returnValue = runInternalQuery(VdcQueryType.GetUnregisteredCinderDisksByStorageDomainId, new IdQueryParameters(getStorageDomainId())); setReturnValue(returnValue.getReturnValue()); return; } // first, run getImagesList query into vdsm to get all of the images on the storage domain - then store in // imagesList VDSReturnValue imagesListResult = runVdsCommand(VDSCommandType.GetImagesList, new GetImagesListVDSCommandParameters(getStorageDomainId(), getStoragePoolId())); @SuppressWarnings("unchecked") List<Guid> imagesList = (List<Guid>) imagesListResult.getReturnValue(); // fromDao is a list of all disk images on the domain from the Dao List<DiskImage> fromDao = diskImageDao.getAllSnapshotsForStorageDomain(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()); } List<Disk> unregisteredDisks = new ArrayList<>(); for (Guid unregisteredDiskId : imagesList) { GetUnregisteredDiskQueryParameters unregQueryParams = new GetUnregisteredDiskQueryParameters( unregisteredDiskId, getStorageDomainId(), getStoragePoolId()); VdcQueryReturnValue unregQueryReturn = runInternalQuery(VdcQueryType.GetUnregisteredDisk, unregQueryParams); if (unregQueryReturn.getSucceeded()) { unregisteredDisks.add(unregQueryReturn.getReturnValue()); } else { log.debug("Could not get populated disk: {}", unregQueryReturn.getExceptionString()); } } getQueryReturnValue().setReturnValue(unregisteredDisks); } protected Guid getStorageDomainId() { return getParameters().getStorageDomainId(); } protected Guid getStoragePoolId() { return getParameters().getStoragePoolId(); } }