package org.ovirt.engine.core.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Named; import javax.inject.Singleton; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.businessentities.storage.LunDisk; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.DiskImageDaoImpl.CinderDiskRowMapper; import org.ovirt.engine.core.dao.DiskImageDaoImpl.DiskImageRowMapper; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @Named @Singleton public class DiskDaoImpl extends BaseDao implements DiskDao { @Override public Disk get(Guid id) { return get(id, null, false); } @Override public Disk get(Guid id, Guid userID, boolean isFiltered) { return getCallsHandler().executeRead("GetDiskByDiskId", diskRowMapper, getCustomMapSqlParameterSource() .addValue("disk_id", id).addValue("user_id", userID).addValue("is_filtered", isFiltered)); } @Override public List<Disk> getAllForVm(Guid id) { return getAllForVm(id, false); } @Override public List<Disk> getAllForVm(Guid id, boolean onlyPluggedDisks) { return getAllForVm(id, onlyPluggedDisks, null, false); } @Override public List<Disk> getAllForVm(Guid id, Guid userID, boolean isFiltered) { return getAllForVm(id, false, userID, isFiltered); } @Override public List<Disk> getAllForVm(Guid id, boolean onlyPluggedDisks, Guid userID, boolean isFiltered) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vm_guid", id) .addValue("only_plugged", onlyPluggedDisks) .addValue("user_id", userID) .addValue("is_filtered", isFiltered); return getCallsHandler().executeReadList("GetDisksVmGuid", diskForVmRowMapper, parameterSource); } @Override public List<Disk> getAllForVmPartialData(Guid vmId, boolean onlyPluggedDisks, Guid userID, boolean isFiltered) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vm_guid", vmId) .addValue("only_plugged", onlyPluggedDisks) .addValue("user_id", userID) .addValue("is_filtered", isFiltered); return getCallsHandler().executeReadList("GetDisksVmGuidBasicView", diskBasicViewRowMapper, parameterSource); } @Override public Map<Guid, List<Disk>> getAllForVms(Collection<Guid> vmIds) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vm_guids", createArrayOfUUIDs(vmIds)); List<Pair<Guid, Disk>> pairs = getCallsHandler().executeReadList( "GetDisksVmGuids", disksForVmsRowMapper, parameterSource); Map<Guid, List<Disk>> resultMap = new HashMap<>(); for (Pair<Guid, Disk> pair : pairs) { resultMap.putIfAbsent(pair.getFirst(), new ArrayList<>()); resultMap.get(pair.getFirst()).add(pair.getSecond()); } return resultMap; } @Override public List<Disk> getAll() { return getAll(null, false); } @Override public List<Disk> getAll(Guid userID, boolean isFiltered) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("user_id", userID).addValue("is_filtered", isFiltered); return getCallsHandler().executeReadList("GetAllFromDisks", diskRowMapper, parameterSource); } @Override public List<Disk> getAllAttachableDisksByPoolId(Guid poolId, Guid vmId, Guid userId, boolean isFiltered) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("storage_pool_id", poolId) .addValue("vm_id", vmId) .addValue("user_id", userId) .addValue("is_filtered", isFiltered); return getCallsHandler().executeReadList("GetAllAttachableDisksByPoolId", diskRowMapper, parameterSource); } @Override public Disk getVmBootActiveDisk(Guid vmId) { return getCallsHandler().executeRead("GetVmBootActiveDisk", diskRowMapper, getCustomMapSqlParameterSource().addValue("vm_guid", vmId)); } @Override public List<Disk> getAllFromDisksByDiskStorageType(DiskStorageType diskStorageType, Guid userID, boolean isFiltered) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("disk_storage_type", diskStorageType.getValue()) .addValue("user_id", userID) .addValue("is_filtered", isFiltered); return getCallsHandler().executeReadList("GetAllFromDisksByDiskStorageType", diskRowMapper, parameterSource); } @Override public List<Disk> getAllWithQuery(String query) { return getJdbcTemplate().query(query, diskRowMapper); } private static final RowMapper<Disk> diskRowMapper = (rs, rowNum) -> { Disk disk = null; DiskStorageType diskStorageType = DiskStorageType.forValue(rs.getInt("disk_storage_type")); switch (diskStorageType) { case IMAGE: disk = DiskImageRowMapper.instance.mapRow(rs, rowNum); break; case LUN: disk = LunDiskRowMapper.instance.mapRow(rs, rowNum); break; case CINDER: disk = CinderDiskRowMapper.instance.mapRow(rs, rowNum); break; } return disk; }; private static final RowMapper<Disk> diskForVmRowMapper = (rs, rowNum) -> { Disk disk = diskRowMapper.mapRow(rs, rowNum); disk.setPlugged(rs.getBoolean("is_plugged")); disk.setLogicalName(rs.getString("logical_name")); return disk; }; private static final RowMapper<Disk> diskBasicViewRowMapper = (rs, rowNum) -> { DiskImage disk = new DiskImage(); disk.setDiskAlias(rs.getString("disk_alias")); disk.setSize(rs.getLong("size")); disk.setId(getGuid(rs, "disk_id")); return disk; }; private static final RowMapper<Pair<Guid, Disk>> disksForVmsRowMapper = (rs, rowNum) -> { Disk disk = diskForVmRowMapper.mapRow(rs, rowNum); Guid vmId = new Guid(rs.getString("vm_id")); return new Pair<>(vmId, disk); }; private static class LunDiskRowMapper extends AbstractDiskRowMapper<LunDisk> { public static LunDiskRowMapper instance = new LunDiskRowMapper(); private LunDiskRowMapper() { } @Override public LunDisk mapRow(ResultSet rs, int rowNum) throws SQLException { LunDisk disk = super.mapRow(rs, rowNum); disk.setLun(LunDaoImpl.MAPPER.mapRow(rs, rowNum)); return disk; } @Override protected LunDisk createDiskEntity() { return new LunDisk(); } } }