package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Disk; import org.ovirt.engine.api.model.Disks; import org.ovirt.engine.api.model.StorageDomain; import org.ovirt.engine.api.model.StorageDomains; import org.ovirt.engine.api.model.StorageType; import org.ovirt.engine.api.restapi.logging.Messages; import org.ovirt.engine.api.restapi.resource.utils.DiskResourceUtils; import org.ovirt.engine.api.restapi.util.ParametersHelper; import org.ovirt.engine.core.common.action.AddDiskParameters; import org.ovirt.engine.core.common.action.RegisterDiskParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; 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.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class AbstractBackendStorageDomainDisksResource extends AbstractBackendCollectionResource<Disk, org.ovirt.engine.core.common.businessentities.storage.Disk> { public static final String UNREGISTERED = "unregistered"; private final QueryIdResolver<Guid> ID_RESOLVER = new QueryIdResolver<>( VdcQueryType.GetDiskByDiskId, IdQueryParameters.class ); protected final Guid storageDomainId; public AbstractBackendStorageDomainDisksResource(Guid storageDomainId) { super(Disk.class, org.ovirt.engine.core.common.businessentities.storage.Disk.class); this.storageDomainId = storageDomainId; } public Disks list() { boolean unregistered = ParametersHelper.getBooleanParameter(httpHeaders, uriInfo, UNREGISTERED, true, false); if (unregistered) { Guid dataCenterId = BackendDataCenterHelper.lookupByStorageDomainId(this, storageDomainId); return mapCollection(getBackendCollection(VdcQueryType.GetUnregisteredDisks, new GetUnregisteredDisksQueryParameters(storageDomainId, dataCenterId))); } else { return mapCollection(getBackendCollection(VdcQueryType.GetAllDisksByStorageDomainId, new IdQueryParameters(storageDomainId))); } } public Response add(Disk disk) { boolean unregistered = ParametersHelper.getBooleanParameter(httpHeaders, uriInfo, UNREGISTERED, true, false); if (unregistered) { // 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. Guid dataCenterId = BackendDataCenterHelper.lookupByStorageDomainId(this, storageDomainId); GetUnregisteredDiskQueryParameters getDiskParams = new GetUnregisteredDiskQueryParameters( asGuid(disk.getId()), storageDomainId, dataCenterId); 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(); params.setDiskInfo(getMapper(Disk.class, org.ovirt.engine.core.common.businessentities.storage.Disk.class).map( disk, null)); params.setStorageDomainId(this.storageDomainId); return performCreate(VdcActionType.AddDisk, params, ID_RESOLVER); } } private void validateDiskForCreation(Disk disk) { if (DiskResourceUtils.isLunDisk(disk)) { validateParameters(disk.getLunStorage(), 2, "type"); // when creating a LUN disk, user must specify type. StorageType storageType = disk.getLunStorage().getType(); if (storageType != null && storageType == StorageType.ISCSI) { validateParameters(disk.getLunStorage().getLogicalUnits().getLogicalUnits().get(0), 3, "address", "target", "port", "id"); } } else if (disk.isSetLunStorage() && (!disk.getLunStorage().isSetLogicalUnits() || !disk.getLunStorage().getLogicalUnits().isSetLogicalUnits())) { // TODO: Implement nested entity existence validation infra for validateParameters() throw new WebFaultException( null, localize(Messages.INCOMPLETE_PARAMS_REASON), localize(Messages.INCOMPLETE_PARAMS_DETAIL_TEMPLATE, "LogicalUnit", "", "add"), Response.Status.BAD_REQUEST ); } else { validateParameters(disk, 2, "provisionedSize|size", "format"); // Non lun disks require size and format } } @Override protected Disk addParents(Disk disk) { StorageDomain storageDomain = new StorageDomain(); storageDomain.setId(storageDomainId.toString()); StorageDomains storageDomains = new StorageDomains(); storageDomains.getStorageDomains().add(storageDomain); disk.setStorageDomain(storageDomain); disk.setStorageDomains(storageDomains); return disk; } private Disks mapCollection(List<org.ovirt.engine.core.common.businessentities.storage.Disk> entities) { Disks collection = new Disks(); for (org.ovirt.engine.core.common.businessentities.storage.Disk disk : entities) { collection.getDisks().add(addLinks(populate(map(disk), disk))); } return collection; } }