package org.ovirt.engine.core.dao;
import java.util.List;
import javax.inject.Named;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.businessentities.ActionGroup;
import org.ovirt.engine.core.common.businessentities.ExternalStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StorageFormatType;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.compat.Guid;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SingleColumnRowMapper;
/**
* {@code StorageDomainDaoImpl} provides an implementation of {@link StorageDomainDao}.
*/
@Named
@Singleton
@SuppressWarnings("synthetic-access")
public class StorageDomainDaoImpl extends BaseDao implements StorageDomainDao {
@Override
public Guid getMasterStorageDomainIdForPool(Guid poolId) {
return getStorageDomainId(poolId, StorageDomainType.Master);
}
@Override
public List<StorageDomain> getStorageDomains(Guid poolId, StorageDomainType type) {
return getStorageDomains(poolId, type, null);
}
@Override
public List<StorageDomain> getStorageDomains(Guid poolId, StorageDomainType type, StorageDomainStatus status) {
Integer statusNum = status == null ? null : status.getValue();
return getCallsHandler().executeReadList("Getstorage_domain_by_type_storagePoolId_and_status",
storageDomainRowMapper,
getCustomMapSqlParameterSource()
.addValue("storage_pool_id", poolId)
.addValue("storage_domain_type", type.getValue())
.addValue("status", statusNum));
}
@Override
public Guid getIsoStorageDomainIdForPool(Guid poolId, StorageDomainStatus status) {
return getStorageDomainId(poolId, StorageDomainType.ISO, status);
}
@Override
public StorageDomain get(Guid id) {
return get(id, null, false);
}
@Override
public StorageDomain get(Guid id, Guid userID, boolean isFiltered) {
return getCallsHandler().executeRead("Getstorage_domains_By_id",
storageDomainRowMapper,
getCustomMapSqlParameterSource()
.addValue("id", id)
.addValue("user_id", userID)
.addValue("is_filtered", isFiltered));
}
@Override
public StorageDomain getForStoragePool(Guid id, Guid storagepool) {
return getCallsHandler().executeRead("Getstorage_domains_By_id_and_by_storage_pool_id",
storageDomainRowMapper,
getCustomMapSqlParameterSource()
.addValue("id", id).addValue("storage_pool_id", storagepool));
}
@Override
public List<StorageDomain> getAllForConnection(String connection) {
return getCallsHandler().executeReadList("Getstorage_domains_By_connection", storageDomainRowMapper,
getCustomMapSqlParameterSource()
.addValue("connection", connection));
}
@Override
public List<StorageDomain> getAllByConnectionId(Guid connectionId) {
return getCallsHandler().executeReadList("GetAllFromStorageDomainsByConnectionId",
storageDomainRowMapper,
getCustomMapSqlParameterSource()
.addValue("connection_id", connectionId));
}
@Override
public List<StorageDomain> getAllForStoragePool(Guid pool) {
return getAllForStoragePool(pool, null, false);
}
@Override
public List<StorageDomain> getAllForStoragePool(Guid pool, Guid userID, boolean isFiltered) {
return getCallsHandler().executeReadList("Getstorage_domains_By_storagePoolId",
storageDomainRowMapper,
getCustomMapSqlParameterSource()
.addValue("storage_pool_id", pool)
.addValue("user_id", userID)
.addValue("is_filtered", isFiltered));
}
@Override
public List<StorageDomain> getAllForStorageDomain(Guid id) {
return getCallsHandler().executeReadList("Getstorage_domains_List_By_storageDomainId",
storageDomainRowMapper, getCustomMapSqlParameterSource().addValue("storage_domain_id", id));
}
@Override
public List<StorageDomain> getAllWithQuery(String query) {
return getJdbcTemplate().query(query, storageDomainRowMapper);
}
@Override
public List<StorageDomain> getAll() {
return getAll(null, false);
}
@Override
public List<StorageDomain> getAll(Guid userID, boolean isFiltered) {
return getCallsHandler().executeReadList("GetAllFromstorage_domains",
storageDomainRowMapper,
getCustomMapSqlParameterSource().addValue("user_id", userID).addValue("is_filtered", isFiltered));
}
@Override
public void remove(Guid id) {
getCallsHandler().executeModification("Force_Delete_storage_domain", getCustomMapSqlParameterSource()
.addValue("storage_domain_id", id));
}
@Override
public void removeEntitesFromStorageDomain(Guid id) {
getCallsHandler().executeModification("Remove_Entities_From_storage_domain", getCustomMapSqlParameterSource()
.addValue("storage_domain_id", id));
}
@Override
public List<StorageDomain> getAllStorageDomainsByImageId(Guid imageId) {
return getCallsHandler().executeReadList("Getstorage_domains_List_By_ImageId",
storageDomainRowMapper, getCustomMapSqlParameterSource()
.addValue("image_id", imageId));
}
/**
* Row mapper to map a returned row to a {@link StorageDomain} object.
*/
private static final RowMapper<StorageDomain> storageDomainRowMapper = (rs, rowNum) -> {
final StorageDomain entity = new StorageDomain();
entity.setId(getGuidDefaultEmpty(rs, "id"));
entity.setStorage(rs.getString("storage"));
entity.setStorageName(rs.getString("storage_name"));
entity.setDescription(rs.getString("storage_description"));
entity.setStoragePoolId(getGuid(rs, "storage_pool_id"));
entity.setComment(rs.getString("storage_comment"));
entity.setStorageType(StorageType.forValue(rs.getInt("storage_type")));
entity.setStoragePoolName(rs.getString("storage_pool_name"));
entity.setStorageDomainType(StorageDomainType.forValue(rs.getInt("storage_domain_type")));
entity.setStorageFormat(StorageFormatType.forValue(rs.getString("storage_domain_format_type")));
entity.setAvailableDiskSize((Integer) rs.getObject("available_disk_size"));
entity.setUsedDiskSize((Integer) rs.getObject("used_disk_size"));
entity.setActualImagesSize(rs.getInt("actual_images_size"));
entity.setCommittedDiskSize(rs.getInt("commited_disk_size"));
entity.setStatus(StorageDomainStatus.forValue(rs.getInt("status")));
entity.setExternalStatus(ExternalStatus.forValue(rs.getInt("external_status")));
entity.setStorageDomainSharedStatus(
StorageDomainSharedStatus.forValue(rs.getInt("storage_domain_shared_status")));
entity.setAutoRecoverable(rs.getBoolean("recoverable"));
entity.setContainsUnregisteredEntities(rs.getBoolean("contains_unregistered_entities"));
entity.setLastTimeUsedAsMaster(rs.getLong("last_time_used_as_master"));
entity.setWipeAfterDelete(rs.getBoolean("wipe_after_delete"));
entity.setDiscardAfterDelete(rs.getBoolean("discard_after_delete"));
entity.setSupportsDiscard(rs.getBoolean("supports_discard"));
entity.setSupportsDiscardZeroesData(rs.getBoolean("supports_discard_zeroes_data"));
entity.setFirstMetadataDevice(rs.getString("first_metadata_device"));
entity.setVgMetadataDevice(rs.getString("vg_metadata_device"));
entity.setWarningLowSpaceIndicator(rs.getInt("warning_low_space_indicator"));
entity.setCriticalSpaceActionBlocker(rs.getInt("critical_space_action_blocker"));
entity.setHostedEngineStorage(rs.getBoolean("is_hosted_engine_storage"));
return entity;
};
@Override
public List<StorageDomain> getAllByStoragePoolAndConnection(Guid storagePoolId, String connection) {
return getCallsHandler().executeReadList("Getstorage_domains_By_storage_pool_id_and_connection",
storageDomainRowMapper,
getCustomMapSqlParameterSource()
.addValue("storage_pool_id", storagePoolId)
.addValue("connection", connection));
}
@Override
public List<StorageDomain> listFailedAutorecoverables() {
return getCallsHandler().executeReadList("GetFailingStorage_domains", storageDomainRowMapper, null);
}
@Override
public List<StorageDomain> getPermittedStorageDomainsByStoragePool(Guid userId, ActionGroup actionGroup, Guid storagePoolId) {
return getCallsHandler().executeReadList("Getstorage_domains_by_storage_pool_id_with_permitted_action",
storageDomainRowMapper,
getCustomMapSqlParameterSource()
.addValue("user_id", userId)
.addValue("action_group_id", actionGroup.getId())
.addValue("storage_pool_id", storagePoolId));
}
@Override
public List<Guid> getVmAndTemplatesIdsByStorageDomainId(Guid storageDomainId, boolean includeShareableDisks, boolean includeSnapshotDisks) {
return getCallsHandler().executeReadList("GetVmAndTemplatesIdsByStorageDomainId",
createGuidMapper(),
getCustomMapSqlParameterSource()
.addValue("storage_domain_id", storageDomainId)
.addValue("include_shareable", includeShareableDisks)
.addValue("active_only", !includeSnapshotDisks));
}
@Override
public long getNumberOfImagesInStorageDomain(Guid storageDomainId) {
return getCallsHandler().executeRead("GetNumberOfImagesInStorageDomain",
SingleColumnRowMapper.newInstance(Long.class),
getCustomMapSqlParameterSource().addValue("storage_domain_id", storageDomainId));
}
@Override
public List<Guid> getHostedEngineStorageDomainIds() {
return getCallsHandler().executeReadList("GetHostedEngineStorageDomainIds",
createGuidMapper(),
getCustomMapSqlParameterSource());
}
/**
* Gets the storage domain id of the given type for the given storage pool id.
*
* @param poolId The storage pool id,
* @param type The storage domain type.
* @return the storage domain id of the given type for the given storage pool id.
*/
private Guid getStorageDomainId(Guid poolId, StorageDomainType type) {
return getStorageDomainId(poolId, type, null);
}
/**
* Gets the storage domain id of the given type for the given storage pool id, type and status.
* It implicitly assumes there can be only one domain of this type.
*
* @param poolId The storage pool id,
* @param type The storage domain type.
* @return the storage domain id of the given type for the given storage pool id.
*/
private Guid getStorageDomainId(Guid poolId, StorageDomainType type, StorageDomainStatus status) {
return getStorageDomains(poolId, type, status).stream().findFirst().map(StorageDomain::getId).orElse(Guid.Empty);
}
}