package org.ovirt.engine.core.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import javax.inject.Named;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.businessentities.HostDevice;
import org.ovirt.engine.core.common.businessentities.HostDeviceId;
import org.ovirt.engine.core.common.businessentities.HostDeviceView;
import org.ovirt.engine.core.common.businessentities.VmDevice;
import org.ovirt.engine.core.common.businessentities.VmHostDevice;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.utils.SerializationFactory;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SingleColumnRowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
@Named
@Singleton
public class HostDeviceDaoImpl extends MassOperationsGenericDao<HostDevice, HostDeviceId> implements HostDeviceDao {
public HostDeviceDaoImpl() {
super("HostDevice");
setProcedureNameForGet("GetHostDeviceByHostIdAndDeviceName");
}
@Override
protected MapSqlParameterSource createIdParameterMapper(HostDeviceId hostDeviceId) {
return getCustomMapSqlParameterSource()
.addValue("host_id", hostDeviceId.getHostId())
.addValue("device_name", hostDeviceId.getDeviceName());
}
@Override
protected MapSqlParameterSource createFullParametersMapper(HostDevice entity) {
return createIdParameterMapper(entity.getId())
.addValue("parent_device_name", entity.getParentDeviceName())
.addValue("capability", entity.getCapability())
.addValue("iommu_group", entity.getIommuGroup())
.addValue("product_name", entity.getProductName())
.addValue("product_id", entity.getProductId())
.addValue("vendor_name", entity.getVendorName())
.addValue("vendor_id", entity.getVendorId())
.addValue("physfn", entity.getParentPhysicalFunction())
.addValue("total_vfs", entity.getTotalVirtualFunctions())
.addValue("net_iface_name", entity.getNetworkInterfaceName())
.addValue("driver", entity.getDriver())
.addValue("is_assignable", entity.isAssignable());
}
@Override
protected RowMapper<HostDevice> createEntityRowMapper() {
return HostDeviceRowMapper.instance;
}
@Override
public List<HostDevice> getHostDevicesByHostId(Guid hostId) {
return getCallsHandler().executeReadList("GetHostDevicesByHostId",
createEntityRowMapper(),
getCustomMapSqlParameterSource().addValue("host_id", hostId));
}
@Override
public List<HostDevice> getHostDevicesByHostIdAndIommuGroup(Guid hostId, int iommuGroup) {
return getCallsHandler().executeReadList("GetHostDevicesByHostIdAndIommuGroup",
createEntityRowMapper(),
getCustomMapSqlParameterSource().addValue("host_id", hostId).addValue("iommu_group", iommuGroup));
}
@Override
public HostDevice getHostDeviceByHostIdAndDeviceName(Guid hostId, String deviceName) {
return get(new HostDeviceId(hostId, deviceName));
}
@Override
public boolean checkVmHostDeviceAvailability(Guid vmId, Guid hostId) {
return getCallsHandler().executeRead("CheckVmHostDeviceAvailability",
SingleColumnRowMapper.newInstance(Boolean.class),
getCustomMapSqlParameterSource().addValue("vm_id", vmId).addValue("host_id", hostId));
}
@Override
public void setVmIdOnHostDevice(HostDeviceId hostDeviceId, Guid vmId) {
getCallsHandler().executeModification("SetVmIdOnHostDevice",
createIdParameterMapper(hostDeviceId)
.addValue("vm_id", vmId));
}
@Override
public void markHostDevicesUsedByVmId(Guid vmId, Guid hostId) {
getCallsHandler().executeModification("MarkHostDevicesUsedByVmId",
getCustomMapSqlParameterSource()
.addValue("vm_id", vmId)
.addValue("host_id", hostId));
}
@Override
public void freeHostDevicesUsedByVmId(Guid vmId) {
getCallsHandler().executeModification("FreeHostDevicesUsedByVmId",
getCustomMapSqlParameterSource().addValue("vm_id", vmId));
}
@Override
public List<HostDeviceView> getVmExtendedHostDevicesByVmId(Guid vmId) {
return getCallsHandler().executeReadList("GetVmExtendedHostDevicesByVmId",
ExtendedHostDeviceRowMapper.instance,
getCustomMapSqlParameterSource().addValue("vm_id", vmId));
}
@Override
public List<VmDevice> getVmDevicesAttachedToHost(Guid hostId) {
return getCallsHandler().executeReadList("GetVmDevicesAttachedToHost",
VmDeviceDaoImpl.vmDeviceRowMapper,
getCustomMapSqlParameterSource().addValue("host_id", hostId));
}
@Override
public List<HostDeviceView> getExtendedHostDevicesByHostId(Guid hostId) {
return getCallsHandler().executeReadList("GetExtendedHostDevicesByHostId",
ExtendedHostDeviceRowMapper.instance,
getCustomMapSqlParameterSource().addValue("host_id", hostId));
}
@Override
public void cleanDownVms() {
getCallsHandler().executeModification("CleanDownVms",
getCustomMapSqlParameterSource());
}
private abstract static class BaseHostDeviceRowMapper<T extends HostDevice> implements RowMapper<T> {
protected void map(ResultSet rs, HostDevice device) throws SQLException{
device.setHostId(getGuid(rs, "host_id"));
device.setDeviceName(rs.getString("device_name"));
device.setParentDeviceName(rs.getString("parent_device_name"));
device.setCapability(rs.getString("capability"));
device.setIommuGroup((Integer) rs.getObject("iommu_group"));
device.setProductName(rs.getString("product_name"));
device.setProductId(rs.getString("product_id"));
device.setVendorName(rs.getString("vendor_name"));
device.setVendorId(rs.getString("vendor_id"));
device.setParentPhysicalFunction(rs.getString("physfn"));
device.setTotalVirtualFunctions((Integer) rs.getObject("total_vfs"));
device.setNetworkInterfaceName(rs.getString("net_iface_name"));
device.setAssignable(rs.getBoolean("is_assignable"));
device.setVmId(getGuid(rs, "vm_id"));
device.setDriver(rs.getString("driver"));
}
}
private static class HostDeviceRowMapper extends BaseHostDeviceRowMapper<HostDevice> {
public static final HostDeviceRowMapper instance = new HostDeviceRowMapper();
@Override
public HostDevice mapRow(ResultSet rs, int rowNum) throws SQLException {
HostDevice device = new HostDevice();
map(rs, device);
return device;
}
}
private static class ExtendedHostDeviceRowMapper extends BaseHostDeviceRowMapper<HostDeviceView> {
public static final ExtendedHostDeviceRowMapper instance = new ExtendedHostDeviceRowMapper();
@Override
public HostDeviceView mapRow(ResultSet rs, int rowNum) throws SQLException {
HostDeviceView device = new HostDeviceView();
map(rs, device);
device.setConfiguredVmId(getGuid(rs, "configured_vm_id"));
device.setAttachedVmNames(split(rs.getString("attached_vm_names")));
device.setRunningVmName(rs.getString("running_vm_name"));
HashMap specParams = SerializationFactory.getDeserializer()
.deserializeOrCreateNew(rs.getString("spec_params"), HashMap.class);
device.setIommuPlaceholder(specParams != null && VmHostDevice.isIommuPlaceHolder(specParams));
return device;
}
}
}