package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.UriInfo; import org.ovirt.engine.api.common.util.DetailHelper; import org.ovirt.engine.api.common.util.LinkHelper; import org.ovirt.engine.api.model.Disk; import org.ovirt.engine.api.model.Disks; import org.ovirt.engine.api.model.Statistic; import org.ovirt.engine.api.model.Statistics; import org.ovirt.engine.api.resource.DeviceResource; import org.ovirt.engine.api.resource.DevicesResource; import org.ovirt.engine.core.common.action.AddDiskToVmParameters; import org.ovirt.engine.core.common.action.RemoveDisksFromVmParameters; import org.ovirt.engine.core.common.action.UpdateVmDiskParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResource.ParametersProvider; public class BackendDisksResource extends AbstractBackendDevicesResource<Disk, Disks, DiskImage> implements DevicesResource<Disk, Disks> { private static final String SUB_COLLECTIONS = "statistics"; public BackendDisksResource(Guid parentId, VdcQueryType queryType, VdcQueryParametersBase queryParams) { super(Disk.class, Disks.class, DiskImage.class, parentId, queryType, queryParams, VdcActionType.AddDiskToVm, VdcActionType.RemoveDisksFromVm, VdcActionType.UpdateVmDisk, SUB_COLLECTIONS); } @Override @SingleEntityResource public DeviceResource<Disk> getDeviceSubResource(String id) { return inject(new BackendDiskResource(id, this, updateType, getUpdateParametersProvider(), getRequiredUpdateFields(), subCollections)); } @Override protected boolean matchEntity(DiskImage entity, Guid id) { return id != null && (id.equals(entity.getId()) || id.equals(entity.getvm_snapshot_id())); } @Override protected boolean matchEntity(DiskImage entity, String name) { return false; } @Override protected String[] getRequiredAddFields() { return new String[] { "size" }; } @Override protected String[] getRequiredUpdateFields() { return new String[0]; } @Override protected VdcActionParametersBase getAddParameters(DiskImage entity, Disk disk) { AddDiskToVmParameters parameters = new AddDiskToVmParameters(parentId, entity); if (disk.isSetStorageDomains() && disk.getStorageDomains().getStorageDomains().get(0).isSetId()) { parameters.setStorageDomainId(new Guid(disk.getStorageDomains().getStorageDomains().get(0).getId())); } return parameters; } @Override protected VdcActionParametersBase getRemoveParameters(String id) { return new RemoveDisksFromVmParameters(parentId, asList(asGuid(id))); } @Override protected ParametersProvider<Disk, DiskImage> getUpdateParametersProvider() { return new UpdateParametersProvider(); } protected class UpdateParametersProvider implements ParametersProvider<Disk, DiskImage> { @Override public VdcActionParametersBase getParameters(Disk incoming, DiskImage entity) { return new UpdateVmDiskParameters(parentId, entity.getId(), map(incoming, entity)); } } @Override protected Disk populate(Disk model, DiskImage entity) { return addStatistics(model, entity, uriInfo, httpHeaders); } Disk addStatistics(Disk model, DiskImage entity, UriInfo ui, HttpHeaders httpHeaders) { if (DetailHelper.include(httpHeaders, "statistics")) { model.setStatistics(new Statistics()); DiskStatisticalQuery query = new DiskStatisticalQuery(newModel(model.getId())); List<Statistic> statistics = query.getStatistics(entity); for (Statistic statistic : statistics) { LinkHelper.addLinks(ui, statistic, query.getParentType()); } model.getStatistics().getStatistics().addAll(statistics); } return model; } }