package org.ovirt.engine.core.dao.network; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.inject.Named; import javax.inject.Singleton; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; import org.ovirt.engine.core.common.businessentities.network.NetworkStatus; import org.ovirt.engine.core.common.businessentities.network.ProviderNetwork; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.DefaultGenericDao; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.SingleColumnRowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @Named @Singleton public class NetworkDaoImpl extends DefaultGenericDao<Network, Guid> implements NetworkDao { public NetworkDaoImpl() { super("network"); setProcedureNameForGet("GetnetworkByid"); setProcedureNameForGetAll("GetAllFromnetwork"); } @Override public Network get(Guid networkId) { return get(networkId, null, false); } @Override public Network get(Guid networkId, Guid userID, boolean isFiltered) { return getCallsHandler().executeRead(getProcedureNameForGet(), NetworkRowMapper.instance, getCustomMapSqlParameterSource().addValue("id", networkId) .addValue("user_id", userID) .addValue("is_filtered", isFiltered)); } @Override public Network getByName(String name) { return getCallsHandler().executeRead("GetnetworkByName", NetworkRowMapper.instance, getCustomMapSqlParameterSource().addValue("networkName", name)); } @Override public Network getByNameAndDataCenter(String name, Guid storagePoolId) { return getCallsHandler().executeRead("GetNetworkByNameAndDataCenter", NetworkRowMapper.instance, getCustomMapSqlParameterSource() .addValue("name", name) .addValue("storage_pool_id", storagePoolId)); } @Override public Network getByNameAndCluster(String name, Guid clusterId) { return getCallsHandler().executeRead("GetNetworkByNameAndCluster", NetworkRowMapper.instance, getCustomMapSqlParameterSource() .addValue("name", name) .addValue("cluster_id", clusterId)); } @Override public List<Network> getAll() { return getAll(null, false); } @Override public List<Network> getAll(Guid userID, boolean isFiltered) { return getCallsHandler().executeReadList("GetAllFromnetwork", NetworkRowMapper.instance, getCustomMapSqlParameterSource().addValue("user_id", userID).addValue("is_filtered", isFiltered)); } @Override public List<Network> getAllForDataCenter(Guid id) { return getAllForDataCenter(id, null, false); } @Override public List<Network> getAllForDataCenter(Guid id, Guid userID, boolean isFiltered) { return getCallsHandler().executeReadList("GetAllNetworkByStoragePoolId", NetworkRowMapper.instance, getCustomMapSqlParameterSource() .addValue("id", id).addValue("user_id", userID).addValue("is_filtered", isFiltered)); } @Override public List<Network> getAllForCluster(Guid id) { if (id == null) { return Collections.emptyList(); } return getAllForCluster(id, null, false); } @Override public List<Network> getAllForCluster(Guid id, Guid userID, boolean isFiltered) { return getCallsHandler().executeReadList("GetAllNetworkByClusterId", NetworkClusterRowMapper.INSTANCE, getCustomMapSqlParameterSource() .addValue("id", id).addValue("user_id", userID).addValue("is_filtered", isFiltered)); } @Override public List<Network> getAllForQos(Guid qosId) { return getCallsHandler().executeReadList("GetAllNetworksByQosId", NetworkRowMapper.instance, createIdParameterMapper(qosId)); } @Override public List<Network> getAllForProvider(Guid id) { return getCallsHandler().executeReadList("GetAllNetworksByNetworkProviderId", NetworkRowMapper.instance, createIdParameterMapper(id)); } @Override public Set<String> getAllNetworkLabelsForDataCenter(Guid id) { return new HashSet<>(getCallsHandler().executeReadList("GetAllNetworkLabelsByDataCenterId", new SingleColumnRowMapper<>(), createIdParameterMapper(id))); } @Override public List<Network> getAllByLabelForCluster(String label, Guid clusterId) { List<Network> networksInCluster = getAllForCluster(clusterId); return networksInCluster.stream() .filter(network -> StringUtils.equals(network.getLabel(), label)).collect(Collectors.toList()); } @Override public Network getManagementNetwork(Guid clusterId) { return getCallsHandler().executeRead("GetManagementNetworkByCluster", NetworkRowMapper.instance, getCustomMapSqlParameterSource().addValue("cluster_id", clusterId)); } @Override public List<Network> getManagementNetworks(Guid dataCenterId) { return getCallsHandler().executeReadList("GetAllManagementNetworksByDataCenterId", NetworkRowMapper.instance, getCustomMapSqlParameterSource().addValue("data_center_id", dataCenterId)); } @Override protected MapSqlParameterSource createIdParameterMapper(Guid id) { return getCustomMapSqlParameterSource().addValue("id", id); } @Override protected MapSqlParameterSource createFullParametersMapper(Network network) { return getCustomMapSqlParameterSource() .addValue("addr", network.getAddr()) .addValue("description", network.getDescription()) .addValue("free_text_comment", network.getComment()) .addValue("id", network.getId()) .addValue("name", network.getName()) .addValue("subnet", network.getSubnet()) .addValue("gateway", network.getGateway()) .addValue("type", network.getType()) .addValue("vlan_id", network.getVlanId()) .addValue("stp", network.getStp()) .addValue("storage_pool_id", network.getDataCenterId()) .addValue("mtu", network.getMtu()) .addValue("vm_network", network.isVmNetwork()) .addValue("provider_network_provider_id", network.getProvidedBy() == null ? null : network.getProvidedBy().getProviderId()) .addValue("provider_network_external_id", network.getProvidedBy() == null ? null : network.getProvidedBy().getExternalId()) .addValue("qos_id", network.getQosId()) .addValue("label", network.getLabel()); } @Override protected RowMapper<Network> createEntityRowMapper() { return NetworkRowMapper.instance; } private static final class NetworkClusterRowMapper extends NetworkRowMapper implements RowMapper<Network> { public static final NetworkClusterRowMapper INSTANCE = new NetworkClusterRowMapper(); @Override public Network mapRow(ResultSet rs, int rowNum) throws SQLException { Network entity = super.mapRow(rs, rowNum); entity.setCluster(new NetworkCluster()); entity.getCluster().setDisplay((Boolean) rs.getObject("is_display")); entity.getCluster().setRequired(rs.getBoolean("required")); entity.getCluster().setStatus(NetworkStatus.forValue(rs.getInt("status"))); entity.getCluster().setMigration(rs.getBoolean("migration")); entity.getCluster().setManagement(rs.getBoolean("management")); entity.getCluster().setGluster(rs.getBoolean("is_gluster")); entity.getCluster().setDefaultRoute(rs.getBoolean("default_route")); return entity; } } abstract static class NetworkRowMapperBase<T extends Network> implements RowMapper<T> { @Override public T mapRow(ResultSet rs, int rowNum) throws SQLException { T entity = createNetworkEntity(); entity.setId(getGuidDefaultEmpty(rs, "id")); entity.setName(rs.getString("name")); entity.setDescription(rs.getString("description")); entity.setComment(rs.getString("free_text_comment")); entity.setType((Integer) rs.getObject("type")); entity.setAddr(rs.getString("addr")); entity.setSubnet(rs.getString("subnet")); entity.setGateway(rs.getString("gateway")); entity.setVlanId((Integer) rs.getObject("vlan_id")); entity.setStp(rs.getBoolean("stp")); entity.setDataCenterId(getGuidDefaultEmpty(rs, "storage_pool_id")); entity.setMtu(rs.getInt("mtu")); entity.setVmNetwork(rs.getBoolean("vm_network")); Guid providerId = getGuid(rs, "provider_network_provider_id"); if (providerId != null) { entity.setProvidedBy(new ProviderNetwork( providerId, rs.getString("provider_network_external_id"))); } entity.setQosId(getGuid(rs, "qos_id")); entity.setLabel(rs.getString("label")); return entity; } protected abstract T createNetworkEntity(); } static class NetworkRowMapper extends NetworkRowMapperBase<Network> { public static final NetworkRowMapper instance = new NetworkRowMapper(); @Override protected Network createNetworkEntity() { return new Network(); } } }