package org.ovirt.engine.core.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.EnumSet; 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.NfsVersion; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacadeUtils; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; /** * {@code StorageServerConnectionDaoImpl} provides an implementation of {@link StorageServerConnectionDao}. */ @Named @Singleton public class StorageServerConnectionDaoImpl extends BaseDao implements StorageServerConnectionDao { @Override public List<StorageServerConnections> getAll() { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource(); return getCallsHandler().executeReadList("GetAllstorage_server_connections", mapper, parameterSource); } @Override public StorageServerConnections get(String id) { return getCallsHandler().executeRead("Getstorage_server_connectionsByid", mapper, getIdParameterSource(id)); } @Override public List<StorageServerConnections> getByIds(List<String> ids) { return getCallsHandler().executeReadList("GetStorageServerConnectionsByIds", mapper, getCustomMapSqlParameterSource().addValue("ids", StringUtils.join(ids, ","))); } @Override public StorageServerConnections getForIqn(String iqn) { return getCallsHandler().executeRead("Getstorage_server_connectionsByIqn", mapper, getCustomMapSqlParameterSource() .addValue("iqn", iqn)); } @Override public List<StorageServerConnections> getAllConnectableStorageSeverConnection(Guid pool) { return getConnectableStorageConnectionsByStorageType(pool, null); } @Override public List<StorageServerConnections> getConnectableStorageConnectionsByStorageType(Guid pool, StorageType storageType) { return getStorageConnectionsByStorageTypeAndStatus(pool, storageType, EnumSet.of(StorageDomainStatus.Active, StorageDomainStatus.Inactive, StorageDomainStatus.Unknown)); } @Override public List<StorageServerConnections> getStorageConnectionsByStorageTypeAndStatus(Guid pool, StorageType storageType, Set<StorageDomainStatus> statuses) { List<String> statusesVals = statuses.stream().map(status -> Integer.toString(status.getValue())).collect(Collectors.toList()); return getCallsHandler().executeReadList("GetStorageConnectionsByStorageTypeAndStatus", mapper, getCustomMapSqlParameterSource() .addValue("storage_pool_id", pool) .addValue("storage_type", (storageType != null) ? storageType.getValue() : null) .addValue("statuses", StringUtils.join(statusesVals, ","))); } @Override public List<StorageServerConnections> getAllForVolumeGroup(String group) { return getCallsHandler().executeReadList("Getstorage_server_connectionsByVolumeGroupId", mapper, getCustomMapSqlParameterSource() .addValue("volume_group_id", group)); } @Override public List<StorageServerConnections> getAllForStorage(String storage) { return getCallsHandler().executeReadList("Getstorage_server_connectionsByConnection", mapper, getCustomMapSqlParameterSource() .addValue("connection", storage)); } @Override public List<StorageServerConnections> getAllForLun(String lunId) { return getCallsHandler().executeReadList("Getstorage_server_connectionsByLunId", mapper, getCustomMapSqlParameterSource() .addValue("lunId", lunId)); } @Override public List<StorageServerConnections> getAllForConnection( StorageServerConnections connection) { // NOTE - any change to this stored procedure parameters should require a change in // the StorageServerConnections class, as those fields can be set only with null or a // actual value (empty string can't be used). return getCallsHandler().executeReadList("Getstorage_server_connectionsByKey", mapper, getCustomMapSqlParameterSource() .addValue("iqn", connection.getIqn()) .addValue("connection", connection.getConnection()) .addValue("port", connection.getPort()) .addValue("portal", connection.getPortal()) .addValue("username", connection.getUserName())); } @Override public List<StorageServerConnections> getAllForDomain(Guid domainId) { return getCallsHandler().executeReadList("GetStorageServerConnectionsForDomain", mapper, getCustomMapSqlParameterSource().addValue("storage_domain_id", domainId)); } @Override public void save(StorageServerConnections connection) { getCallsHandler().executeModification("Insertstorage_server_connections", getFullParameterSource(connection)); } @Override public void update(StorageServerConnections connection) { getCallsHandler().executeModification("Updatestorage_server_connections", getFullParameterSource(connection)); } @Override public void remove(String id) { getCallsHandler().executeModification("Deletestorage_server_connections", getIdParameterSource(id)); } private MapSqlParameterSource getIdParameterSource(String id) { return getCustomMapSqlParameterSource() .addValue("id", id); } private MapSqlParameterSource getFullParameterSource(final StorageServerConnections connection) { return getIdParameterSource(connection.getId()) .addValue("connection", connection.getConnection()) .addValue("iqn", connection.getIqn()) .addValue("port", connection.getPort()) .addValue("portal", connection.getPortal()) .addValue("password", DbFacadeUtils.encryptPassword(connection.getPassword())) .addValue("storage_type", connection.getStorageType()) .addValue("user_name", connection.getUserName()) .addValue("mount_options", connection.getMountOptions()) .addValue("vfs_type", connection.getVfsType()) .addValue("nfs_version", (connection.getNfsVersion() != null) ? connection.getNfsVersion().getValue() : null) .addValue("nfs_timeo", connection.getNfsTimeo()) .addValue("nfs_retrans", connection.getNfsRetrans()) .addValue("gluster_volume_id", connection.getGlusterVolumeId()); } private static final RowMapper<StorageServerConnections> mapper = (rs, rowNum) -> { StorageServerConnections entity = new StorageServerConnections(); entity.setConnection(rs.getString("connection")); entity.setId(rs.getString("id")); entity.setIqn(rs.getString("iqn")); entity.setPort(rs.getString("port")); entity.setPortal(rs.getString("portal")); entity.setPassword(DbFacadeUtils.decryptPassword(rs.getString("password"))); entity.setStorageType(StorageType.forValue(rs.getInt("storage_type"))); entity.setUserName(rs.getString("user_name")); entity.setMountOptions(rs.getString("mount_options")); entity.setVfsType(rs.getString("vfs_type")); entity.setNfsVersion((rs.getString("nfs_version") != null) ? NfsVersion.forValue(rs.getString("nfs_version")) : null); entity.setNfsRetrans(getShort(rs, "nfs_retrans")); entity.setNfsTimeo(getShort(rs, "nfs_timeo")); entity.setGlusterVolumeId(getGuid(rs, "gluster_volume_id")); return entity; }; /** * Get a Short (therefore a number or a null) from a ResultSet. * @param rs resultset * @param column column name * @return the number, of null if the data in the DB is NULL */ static Short getShort(final ResultSet rs, final String column) throws SQLException { short ret = rs.getShort(column); if (ret == 0 && rs.wasNull()) { return null; } return ret; } }